Vector 为OpenLayers中的每个组件绘制具有不同样式的多多边形

Vector 为OpenLayers中的每个组件绘制具有不同样式的多多边形,vector,coding-style,polygon,openlayers,Vector,Coding Style,Polygon,Openlayers,我创建了一个OpenLayers.Feature.Vector,如下所示: var multiPol = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon([polygonGeometry1,polygonGeometry2])); 这两个多边形在地图上表示相同的逻辑对象(“实体”),例如云。这就是为什么我将它们保留在一个特性中。 我希望绘制它,以便在将该多多边形(PolygongGeometry1,Polyg

我创建了一个OpenLayers.Feature.Vector,如下所示:

var multiPol = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiPolygon([polygonGeometry1,polygonGeometry2]));
这两个多边形在地图上表示相同的逻辑对象(“实体”),例如云。这就是为什么我将它们保留在一个特性中。 我希望绘制它,以便在将该多多边形(PolygongGeometry1,PolygongGeometry2)添加到图层时,使用不同的颜色绘制该多多边形的每个组件:

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

我看过OpenLayers中的样式、样式映射和规则,但它们似乎不够。它们确实使我能够用不同的颜色绘制每种几何体类型,但前提是它们属于不同的特征(向量)。有没有办法解决这个问题?我真的必须为每个多边形使用单独的向量吗?

据我所知,要获得此功能,您需要使用自己的类扩展这些类

首先创建OpenLayers.Feature.Vector的扩展,将其命名为YourApp.Feature.MultiVector。通过查看OpenLayers代码,您可以看到如何扩展类的示例。此类应接受样式数组和多多边形。它应该有一个方法,返回一个OpenLayers.Feature.Vectors列表,每个都有自己的风格

其次,创建OpenLayers.Layer.Vector的扩展,将其命名为YourApp.Layer.VectorSupportingMultiStyledFeatures。您需要重写“drawFeature”方法。在drawFeature方法中,测试特征的类型是否为多向量。如果是,则循环遍历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]);

Jon Snyder提出的解决方案为我们提供了一个总体思路,但最终并没有完全起作用(特别是基于OpenLayers 2.1x,扩展
OpenLayers.Layer.Vector对于这项任务来说是不必要的)

我们创建了一个类
YourApp.Handler.EndPointsPath
(扩展
OpenLayers.Handler.Path
),其中函数
geometryClone()
返回类型为
YourApp.geometry.EndPointsPath
的新几何体

然后,我们在
OpenLayers.Renderer.Elements
中修补函数
drawGeometry()
,以绘制此新几何体:

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...)
    }
  }
});
OpenLayers.Util.extend(OpenLayers.Renderer.Elements.prototype{
drawGeometry:函数(几何体、样式、特征ID){
var cl=几何体类名称;
var=true,
i、 len;
if((cl==“OpenLayers.Geometry.Collection”)||
(cl==“OpenLayers.Geometry.MultiPoint”)||
(cl==“OpenLayers.Geometry.MultiLineString”)||
(cl==“OpenLayers.Geometry.MultiPolygon”)||
(cl==“YourApp.Geometry.EndPointsPath”)){
//迭代所有几何体组件并分别绘制每个组件
对于(i=0,len=geometry.components.length;i
我本来打算这样做,但只是想确保没有更简单、更省力的解决方案。谢谢我实现了一个CompositeVector类,它包含一组向量,每个向量都有自己的几何体和可选的样式。我还需要一个特殊的OpenLayers.Layer.Vector实现来支持这些。总而言之:它起作用了:)很抱歉提出了这么一个旧的线程,但我目前正试图实现相同的(OpenLayers 2.12),但遇到了一个问题:我实现了一个多(或复合)向量,它基本上有多个功能,但它本身就是一个功能。我按照建议在Layer.Vector中重写了drawFeature方法,但现在我有了奇怪的行为:特征被正确绘制,但当视口调整大小时,特征被绘制了两次。我认为这一切都归结为拥有自己的特性。还有什么我必须重写的,我不应该忘记的吗?