Openlayers - LayerRedraw () / Поворот объекта / Координаты строки - PullRequest
4 голосов
/ 18 мая 2010

TLDR : у меня есть карта Openlayers со слоем под названием «дорожка». Я хочу удалить дорожку и добавить дорожку обратно. Или выяснить, как построить треугольник на основе одного набора координат и заголовок (см. ниже).


У меня есть изображение 'imageFeature' на слое, который вращается при нагрузке в заданном направлении. Я хочу обновить это вращение, установленное в 'styleMap' на слое под названием 'tracking' .

  1. Я установил переменную 'stylemap' для применения внешнего изображения и поворота.
  2. 'imageFeature' добавляется к слою в указанных координатах.
  3. 'imageFeature' удалено.
  4. 'imageFeature' снова добавлено в новом месте. Вращение не применяется ..

Поскольку 'styleMap' применяется к слою, я думаю, что мне нужно удалить слой и добавить его снова, а не просто 'imageFeature'

Уровень

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

     });

StyleMap

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

Теперь обернут в синхронизированную функцию imageFeature :

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

Тип относится к поиску 1 из 3 изображений. :

           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}
            }

Я попробовал функцию 'redraw ()': , но она возвращает «отслеживание не определено» или «map.layers [2]» не определено.

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

Заголовок является переменной: из ленты JSON.

var heading = 13.542;

Но пока что ничего не получится, он только повернет изображение при загрузке. Изображение будет двигаться в координатах, как и должно быть.

Так что же я делаю не так с функцией перерисовки или как мне заставить это изображение вращаться в реальном времени?

Заранее спасибо

-Ozaki

Добавить: Мне удалось получить

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

, чтобы успешно перерисовать слой 2. Но он все равно не обновляет вращение. Я думаю, потому что карта стилей обновляется. Но он пробегает карту стилей каждую n сек, но обновлений вращения нет, и переменная для заголовка корректно обновляется, если я помещаю часы в firebug.


Если бы я нарисовал треугольник с массивом точек и линий. Как бы я пошел лицом к треугольнику в направлении заголовка. У меня есть Lon / lat одной точки и заголовок.

              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);

В поисках любого способа решения этой проблемы Изображение или строка, кто-нибудь знает, как сделать это, либо добавили награду 100rep Я действительно застрял с этим.


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

Добавление и удаление изображенияFeature

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

Ответы [ 3 ]

3 голосов
/ 26 мая 2010

Решил проблему следующим образом:

            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});

тогда запрос:

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

Проблема решена. Работает отлично.

1 голос
/ 21 мая 2010

Вы также можете попробовать указать заголовок объекта как атрибут:

{"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"
                }
            }
        ]
    }
}

Тогда вам придется переписать вашу функцию поиска следующим образом:

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

Не могли бы вы попробовать и посмотреть, работает ли это? Если вы не знаете, правильно ли установлены атрибуты, вы всегда можете выполнить отладку с помощью firebug, что я всегда и делаю. Есть одна хитрая вещь; при разборе геойсона; «Свойства» переводятся в «Атрибуты» в конечном объекте JavaScript.

1 голос
/ 18 мая 2010

Первое предположение:

Я предполагаю, что ваш слой имеет один точечный объект, который движется и вращается, как при следовании за автомобилем с GPS?

Возможно, было бы лучше, если бы вы просто уничтожили все объекты на слое (при условии, что это только один объект) и перерисовали объект с новым набором заголовков.

Второе предположение: Возможно, вам нужно использовать функцию вместо переменной, чтобы поддерживать прямую связь с вращением.

Пожалуйста, проверьте документацию здесь: http://trac.openlayers.org/wiki/Styles по стилям.

Надеюсь, это немного поможет.

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