Openlayers - LayerRedraw () / Rotación de entidades / Coords de cadena de líneas

TLDR: Tengo un mapa de Openlayers con una capa llamada 'pista'. Quiero eliminar la pista y volver a añadirla. O averiguar cómo trazar un triángulo basado en un conjunto de coordenadas y un encabezado (ver más abajo).


Tengo una imagen 'imageFeature' en una capa que gira con la carga en la dirección que se establece. Quiero que actualice esta rotación que se establece en 'styleMap' en una capa llamada 'rastreo'.

  1. Yo configuro la var 'mapa de estilo' para aplicar la imagen externa y la rotación.
  2. El 'imageFeature' se agrega a la capa en las coordenadas especificadas.
  3. 'imageFeature' es removido.
  4. 'imageFeature' se agrega nuevamente en su nueva ubicación. No se aplica la rotación.

A este tenor, 'styleMap' se aplica a la capa, creo que tengo que eliminar la capa y agregarla de nuevo en lugar de solo la 'imageFeature'

Ponedora :

var tracking = new OpenLayers.Layer.GML("Tracking", "coordinates.json", {
  format: OpenLayers.Format.GeoJSON,
  styleMap: styleMap
});

estiloMapa:

var styleMap = new OpenLayers.StyleMap({
  fillOpacity: 1,
  pointRadius: 10,
  rotation: heading,
});

Ahora envuelto en una función cronometrada el imageFeature:

map.layers[3].addFeatures(new OpenLayers.Feature.Vector(
  new OpenLayers.Geometry.Point(longitude, latitude), {
    rotation: heading,
    type: parseInt(Math.random() * 3)
  }
));

El tipo se refiere a una búsqueda de 1 de 3 imágenes.:

styleMap.addUniqueValueRules("default", "type", lookup);

var lookup = {
  0: {
    externalGraphic: "Image1.png",
    rotation: heading
  },
  1: {
    externalGraphic: "Image2.png",
    rotation: heading
  },
  2: {
    externalGraphic: "Image3.png",
    rotation: heading
  }
}

He probado la función 'redraw ()': pero devuelve "el seguimiento no está definido" o "map.layers [2]" no está definido.

tracking.redraw(true);
map.layers[2].redraw(true);

El título es una variable: desde un feed JSON.

var heading = 13.542;

Pero hasta ahora no se puede hacer que nada funcione, solo rotará la imagen al cargar. Sin embargo, la imagen se moverá en coordenadas como debería.

Entonces, ¿qué estoy haciendo mal con la función de redibujo o cómo puedo hacer que esta imagen gire en vivo?

Gracias por adelantado

-Ozaki

Añadir: Logre conseguir

 map.layers[2].redraw(true);

para volver a dibujar correctamente la capa 2. Pero aún no actualiza la rotación. Estoy pensando porque el mapa de estilo se está actualizando. Pero se ejecuta a través del mapa de estilo cada n segundos, pero no se actualiza la rotación y la variable de rumbo se actualiza correctamente si le pongo un reloj en Firebug.


Si tuviera que dibujar un triángulo con una matriz de puntos y una cadena de líneas. ¿Cómo haría para encarar el triángulo hacia el título? Tengo la longitud / latitud de un punto y el rumbo.

var points = new Array(
  new OpenLayers.Geometry.Point(lon1, lat1),
  new OpenLayers.Geometry.Point(lon2, lat2),
  new OpenLayers.Geometry.Point(lon3, lat3)
);

var line = new OpenLayers.Geometry.LineString(points);

Buscando alguna forma de resolver este problema Imagen o Línea, cualquiera que sepa cómo hacerlo, agregó un 100 repeticiones recompensa Estoy realmente atrapado con esto.


//From getJSON request//
var heading = data.RawHeading;

Agregar y eliminar la imagen

preguntado el 18 de mayo de 10 a las 05:05

Si tuviera que dibujar programáticamente un triángulo. ¿Cómo haría yo para hacer esto? Tengo una coordenadas Lat / Lon y el rumbo. ¿Cómo trazaría programáticamente el triángulo para enfrentar el encabezado? -

Ver arriba: incluso al volver a agregar la función en lugar de definirla como imageFeature, incluso he intentado redefinir toda la función que la agrega y la mueve perfectamente bien. Pero NO rotación ... Intenté definir en Featre.Vector y Geometry.point ... Todavía no tuve suerte. -

3 Respuestas

Resolvió el problema de la siguiente manera:

            var styleMap = new OpenLayers.StyleMap({
                fillOpacity: 1,
                pointRadius: 10,
                rotation: "${angle}",
            });

           var lookup = {
                0: { externalGraphic: "Image1.png", rotation: "${angle}" },
                1: { externalGraphic: "Image2.png", rotation: "${angle}" },
                2: { externalGraphic: "Image3.png", rotation: "${angle}" }
            }
 styleMap.addUniqueValueRules("default", "type", lookup);

 map.layers[3].addFeatures(new OpenLayers.Feature.Vector(
        new OpenLayers.Geometry.Point(lon, lat), {"angle": dir, type: parseInt(Math.random() * 3)}
        ), {"angle": dir});

luego la solicitud:

var dir = (function () {
                $.ajax({
                    'async': false,
                    'global': true,
                    'url': urldefault,
                    'dataType': "json",
                    'success': function (data) {
                        dir = data.Heading
                    }
                });
                return dir;
            })();

Problema resuelto. Funciona perfectamente.

contestado el 26 de mayo de 10 a las 03:05

¡Excelente! Es bueno saber que lo resolviste. ¿Estoy en lo cierto cuando digo que $ {algo} fue un gesto importante para su solución? (Estoy pescando en la recompensa de 100 puntos de repetición: D) De todos modos, ¡es bueno ver que encontraste una solución! - milovanderlinden

Sí, pero tenía que ser "$ ()" para que hiciera referencia correctamente a una variable que se estableció en una variable separada que se llamaba como una solicitud getjson $ getjson. - Sphvn

También puede intentar poner encabezado en el objeto como un atributo:

{"mapFeatures": {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "id": "1579001",
                "x": 51.0,
                "y": 1.2,
                "geometry": {
                    "type": "Point",
                    "coordinates": [
                        51.0,
                        1.2
                    ],
                    "crs": {
                        "type": "OGC",
                        "properties": {
                            "urn": "urn:ogc:def:crs:OGC:1.3:CRS84"
                        }
                    }
                },
                "properties": {
                    "heading": 45,
                    "label": "some_label_goes_here"
                }
            }
        ]
    }
}

Entonces tendrías que reescribir tu función de búsqueda de esta manera:

var lookup = {
      0: {externalGraphic: "Image1.png", rotation: ${heading}},
      1: {externalGraphic: "Image2.png", rotation: ${heading}},
      2: {externalGraphic: "Image3.png", rotation: ${heading}}
}

¿Podrías probar eso y ver si funciona? Si no sabe si los atributos están configurados correctamente, siempre puede depurar con firebug, eso es lo que siempre hago. Hay una cosa engañosa; al analizar geojson; Las "propiedades" se traducen a "atributos" en el objeto final de JavaScript.

contestado el 21 de mayo de 10 a las 13:05

En tu caso; ya que está utilizando una función vectorial; debe establecer el encabezado directamente en la propiedad de atributos: dev.openlayers.org/docs/files/OpenLayers/Feature/… - milovanderlinden

He intentado: nuevo OpenLayers.Geometry.Point (longitud, latitud), {tipo: parseInt (Math.random () * 3), rotación: encabezado} que todavía no establecerá el encabezado. - Sphvn

Feature = (new OpenLayers.Feature.Vector (nuevo OpenLayers.Geometry.Point (longitud, latitud), {rotación: rumbo, tipo: parseInt (Math.random () * 3)}), {rotación: rumbo}); - Sphvn

Además, el objeto que estoy moviendo actualmente está en la capa geojson pero no desde geojson, es un objeto creado a partir del mapa de estilo y colocado manualmente por mí, donde solo estoy sacando el encabezado de un $ getjson separado. - Sphvn

¿Por qué el encabezado vendría de una solicitud diferente? Me suena un poco extraño. De todos modos, su capa nunca podrá responder al cambio de su var de encabezado ya que no tiene ninguna referencia a ella. - milovanderlinden

Primera conjetura:

Supongo que su capa tiene un objeto de un solo punto que se mueve y gira como cuando sigue un automóvil con GPS.

Sería mejor si simplemente destruyera todas las entidades de la capa (asumiendo que es solo una entidad) y vuelva a dibujar la entidad con el nuevo conjunto de encabezados.

Segunda suposición: tal vez necesite usar una función en lugar de una variable para mantener la conexión en vivo con la rotación.

Consulte la documentación aquí: http://trac.openlayers.org/wiki/Styles en estilos.

Espero que esto ayude un poco.

contestado el 18 de mayo de 10 a las 15:05

Actualmente estoy destruyendo todas las funciones (aunque es solo una) y volviéndolas a dibujar, pero no estoy configurando la rotación, ver arriba. Yo diría que porque el mapa de estilo se aplica a la capa, por lo que no tiene ninguna razón para volver a configurar el mapa de estilo o actualizarlo. Así que probablemente esté buscando una forma de destruir y crear la capa para que obligue al mapa de estilo a actualizarse. - Sphvn

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.