Проблема со стилями OpenLayers - PullRequest
6 голосов
/ 30 апреля 2010

Итак, мне надоело постоянно видеть ярко-оранжевые стандартные полигоны, и я пытаюсь научиться стилизовать OpenLayers.

У меня был некоторый успех с:

     var layer_style = OpenLayers.Util.extend({},OpenLayers.Feature.Vector.style['default']);
  layer_style.fillColor = "#000000";
 layer_style.strokeColor = "#000000";
 polygonLayer = new OpenLayers.Layer.Vector("PolygonLayer");
 polygonLayer.style = layer_style;

Но так как я рисую свои полигоны с помощью DrawFeature, мой стиль вступает в силу только после того, как я закончу рисовать, и видеть, как он переходит от ярко-оранжевого к серому, немного неприятно. Итак, я узнал о временных стилях и попробовал:

 var layer_style =  new OpenLayers.Style({"default": {fillColor: "#000000"}, "temporary": {fillColor: "#000000"}})
polygonLayer = new OpenLayers.Layer.Vector("PolygonLayer");
polygonLayer.style = layer_style;

Это заставило меня по-прежнему оставаться оранжевым квадратом - пока я не прекратил рисовать, когда он стал совершенно непрозрачным черным. Я подумал, может быть, мне нужно было явно установить fillOpacity ... без кости. Даже когда я изменил оба цвета заливки на розовый и синий соответственно, я все еще видел только оранжевый и непрозрачный черный.

Я пытался связываться с StyleMaps, так как я читал, что если вы добавляете только один стиль в карту стилей, он использует стиль по умолчанию для всего, включая временный стиль.

var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
var style_map = new OpenLayers.StyleMap(layer_style);
polygonLayer = new OpenLayers.Layer.Vector("PolygonLayer");
polygonLayer.style = style_map;

Это также дало мне черный непрозрачный квадрат. (Даже если этот стиль слоя работает, когда он не указан на карте). Передача карты самому слою выглядит так:

polygonLayer = new OpenLayers.Layer.Vector("PolygonLayer", style_map);

Ничего мне не досталось. Оранжевый полностью, даже после рисования.

polygonLayer = new OpenLayers.Layer.Vector("PolygonLayer", {styleMap: style_map});

Намного более удачно: оранжевый при рисовании, полупрозрачный черный с черным контуром при рисовании. Так же, как когда я не использовал карту. Проблема в том, что все еще нет временного ...

Итак, я попытался инициализировать мою карту следующим образом:

var style_map = new OpenLayers.StyleMap({"default": layer_style, "temporary": layer_style});

Нет непрозрачного квадрата, но и кубика для временного тоже нет ... Все еще оранжевый, щелкая черным прозрачным. Даже если я создаю новый стиль (layer_style2) и устанавливаю временный для этого, все равно не повезло. И не повезло с настройкой стиля «выбор», либо.

Что я делаю не так? Временный IS для моделирования вещей, которые в настоящее время набрасываются, правильно? Есть ли какой-то другой способ для контроллера drawFeature?

Редактировать: установка в значение extensionDefault значения true тоже не помогает ...

var style_map = new OpenLayers.StyleMap({"default": layer_style, "temporary": layer_style}, {"extendDefault": "true"});

Ответы [ 2 ]

12 голосов
/ 02 мая 2010

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

1.Измените стиль обработчика DrawFeature. Функция drawFeature в OpenLayers.Handler.Polygon использует стиль параметра обработчика для функции. Таким образом, вы должны изменить этот стиль.

При создании функции используйте:

var drawPolygon = new OpenLayers.Control.DrawFeature(polygonLayer, OpenLayers.Handler.Polygon, {handlerOptions:{style:myStyle}});

Позже вы можете изменить его:

drawPolygon.handler.style = myStyle;

2. Изменить создание обратного вызова DrawFeature. Измените стиль вновь созданной временной функции при создании обратного вызова.

var drawPolygon = new OpenLayers.Control.DrawFeature(polygonLayer, OpenLayers.Handler.Polygon, {
        callbacks:{create: function(vertex, feature) {
            feature.style = myStyle;
            this.layer.events.triggerEvent("sketchstarted", {vertex:vertex,feature:feature})
}}});

Аналогично, вы можете изменить обратный вызов позже.

4 голосов
/ 23 апреля 2012

Если вы хотите, чтобы все векторы имели постоянный стиль, но не скучный оранжевый, попробуйте следующее:

vecLayer = new OpenLayers.Layer.Vector(
    "Route Layer",  //layer name
    {styleMap: new OpenLayers.StyleMap({
        pointRadius: "6", 
        fillColor: "#666666" 
    }),
    renderers:renderer}
);

У вас есть множество свойств, с которыми вы можете возиться, посмотрите на эти страницы:

...