Рисование MultiPolygon с разными стилями для каждого компонента в OpenLayers - PullRequest
1 голос
/ 30 ноября 2010

У меня есть OpenLayers.Feature.Vector, созданный следующим образом:

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, но их оказалось недостаточно. Они позволяют мне рисовать каждый тип геометрии разным цветом, но только если они принадлежат разным объектам (векторам). Есть ли способ решить эту проблему? Действительно ли я должен использовать отдельный вектор для каждого многоугольника?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2013

Предлагаемое решение Джона Снайдера дало нам общую идею, но в конце концов не сработало полностью (особенно расширение OpenLayers.Layer.Vector не требовалось для этой задачи на основе 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...)
    }
  }
});
1 голос
/ 30 ноября 2010

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

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

Во-вторых, создайте расширение для OpenLayers.Layer.Vector, назовите его YourApp.Layer.VectorSupportingMultiStyledFeatures. Вам нужно будет переопределить метод «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]);
...