2010-11-30 2 views
1

У меня есть OpenLayers.Feature.Vector создается следующим образом:Drawing MultiPolygon с различным стилем для каждого компонента в OpenLayers

var multiPol = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon([polygonGeometry1,polygonGeometry2])); 

Оба многоугольники представляют тот же логический объект («сущность») на карте, скажем, облако. Вот почему я держу их в одной функции. Я хотел бы сделать это так, чтобы каждый компонент этого мульти-угольник (polygonGeometry1, polygonGeometry2) обращается с другим цветом, когда она добавляется к слою:

var layer = new OpenLayers.Layer.Vector("polygonLayer"); 
    layer.addFeatures([multiPol]); 

я взял посмотреть на стили, картах стиля и правила в OpenLayers, но они кажутся недостаточными. Они позволяют мне рисовать каждый тип геометрии разным цветом, но только если они принадлежат к различным функциям (векторам). Есть ли способ решить эту проблему? Действительно ли я должен использовать отдельный вектор для каждого полигона?

ответ

1

Насколько я могу судить, чтобы получить эту функциональность, вам нужно будет расширить классы своим.

Сначала создайте расширение для OpenLayers.Feature.Vector, назовите его YourApp.Feature.MultiVector. Вы можете увидеть примеры того, как расширить классы, просмотрев код OpenLayers. Этот класс должен принимать массив стилей и multiPolygon. Он должен иметь метод, который будет возвращать список OpenLayers.Feature.Vectors, каждый со своим стилем.

Второй создать расширение для OpenLayers.Layer.Vector, назовите его. Вам нужно будет переопределить метод drawFeature. В методе метода drawFeature проверьте, является ли тип функции MultiVector. Если это так, пропустите каждую функцию в MultiVector и вызовите renderer.drawFeature (функция). В противном случае вызовите метод super.drawFeature.

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

var multiPol = new YourApp.Feature.MultiVector(
    new OpenLayers.Geometry.MultiPolygon([polygonGeometry1,polygonGeometry2]), 
    [style1,style2,style3,style4]); 

var layer = new YourApp.Layer.VectorSupportingMultiStyledFeatures("polygonLayer"); 
layer.addFeatures([multiPol]); 
+0

я собирался сделать что-то вроде этого, но просто хотел, чтобы убедиться, что нет более простой и менее работы потребляя решение. Благодаря! – gregorej 2010-12-01 07:57:36

2

Предлагаемое решение Джон Снайдер предоставил нам общее представление, но не в полной мере работать в конце концов (особенно расширение OpenLayers.Layer.Vector WASN» t необходимо для этой задачи на основе OpenLayers 2.1x).

Мы создали класс YourApp.Handler.EndPointsPath (простирающуюся OpenLayers.Handler.Path), где функция geometryClone() возвращает новую геометрию типа YourApp.Geometry.EndPointsPath.

Затем мы исправили функцию drawGeometry() в OpenLayers.Renderer.Elements сделать эту новую геометрию:

OpenLayers.Util.extend(OpenLayers.Renderer.Elements.prototype, { 

    drawGeometry: function (geometry, style, featureId) { 
    var cl = geometry.CLASS_NAME; 

    var rendered = true, 
     i, len; 
    if ((cl === "OpenLayers.Geometry.Collection") || 
     (cl === "OpenLayers.Geometry.MultiPoint") || 
     (cl === "OpenLayers.Geometry.MultiLineString") || 
     (cl === "OpenLayers.Geometry.MultiPolygon") || 
     (cl === "YourApp.Geometry.EndPointsPath")) { 
     // Iterate over all Geometry components and draw each individually 
     for (i = 0, len = geometry.components.length; i < len; i++) { 
     // Is there a style for each of the components? 
     if (OpenLayers.Util.isArray(style)) { 
      // Draw Geometry with own style 
      rendered = this.drawGeometry(geometry.components[i], style[i], featureId) && rendered; 
     } else { 
      // Draw Geometry with common style 
      rendered = this.drawGeometry(geometry.components[i], style, featureId) && rendered; 
     } 
     } 
     return rendered; 
    } 
    // (...standard code...) 
    }, 

    eraseGeometry: function (geometry, featureId) { 
    var cl = geometry.CLASS_NAME, 
     i, len; 
    if ((cl === "OpenLayers.Geometry.MultiPoint") || 
     (cl === "OpenLayers.Geometry.MultiLineString") || 
     (cl === "OpenLayers.Geometry.MultiPolygon") || 
     (cl === "YourApp.Geometry.EndPointsPath") || 
     (cl === "OpenLayers.Geometry.Collection")) { 
     for (i = 0, len = geometry.components.length; i < len; i++) { 
     this.eraseGeometry(geometry.components[i], featureId); 
     } 
     // (...standard code...) 
    } 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^