2010-11-30 6 views
1

Ich habe ein OpenLayers.Feature.Vector wie folgt erstellt:Zeichnung Multipolygon mit anderen Stil für jede Komponente in Openlayers

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

Beide Polygone gleiche logische Objekt repräsentieren (eine „Einheit“) auf einer Karte, sagen wir ein Wolke. Deshalb halte ich sie in einer Funktion. Ich mag es ziehen, so dass jede Komponente dieses Multi-Polygon (polygonGeometry1, polygonGeometry2) mit unterschiedlicher Farbe gezeichnet wird, wenn es zu einer Schicht hinzugefügt wird:

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

ich einen Blick auf Design, Stil Karten genommen habe und Regeln in OpenLayers, aber sie scheinen nicht ausreichend zu sein. Sie ermöglichen mir, jeden Geometrietyp mit unterschiedlicher Farbe zu zeichnen, aber nur, wenn sie zu verschiedenen Merkmalen (Vektoren) gehören. Gibt es eine Möglichkeit, dieses Problem zu lösen? Muss ich wirklich separaten Vektor für jedes Polygon verwenden?

Antwort

1

Soweit ich sagen kann, um diese Funktionalität zu erhalten, müssen Sie die Klassen mit Ihren eigenen erweitern.

Zuerst erstellen Sie eine Erweiterung für OpenLayers.Feature.Vector, nennen Sie es YourApp.Feature.MultiVector. Sie können Beispiele zum Erweitern von Klassen anzeigen, indem Sie sich den OpenLayers-Code ansehen. Diese Klasse sollte ein Array von Stilen und das MultiPolygon akzeptieren. Es sollte eine Methode haben, die eine Liste von OpenLayers.Feature.Vectors mit jeweils eigenem Stil zurückgibt.

Zweitens erstellen Sie eine Erweiterung für OpenLayers.Layer.Vector, nennen Sie es YourApp.Layer.VectorSupportingMultiStyledFeatures. Sie müssen die Methode "drawFeature" überschreiben. Überprüfen Sie in der Methode drawFeature, ob der Typ des Features ein MultiVector ist. Wenn dies der Fall ist, durchlaufen Sie jede Funktion im MultiVector und rufen Sie renderer.drawFeature (feature) auf. Andernfalls rufen Sie die super.drawFeature-Methode auf.

So Ihr Code zu nennen es würde wie folgt aussehen:

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

ich war, so etwas zu tun, sondern wollten nur sicherstellen, dass es keine einfachere und weniger Arbeit aufwendige Lösung. Vielen Dank! – gregorej

+0

Ich habe eine CompositeVector-Klasse implementiert, die eine Reihe von Vektoren enthält, wobei jeder Vektor seine eigene Geometrie und optional einen eigenen Stil hat. Ich brauchte auch eine spezielle OpenLayers.Layer.Vector-Implementierung, die diese unterstützt. Um es zusammenzufassen: es hat funktioniert :) – gregorej

+0

Entschuldigung, dass ich so einen alten Thread erstelle, aber ich versuche gerade das Gleiche zu erreichen (mit OpenLayers 2.12), lief aber auf ein Problem: Ich habe einen Multi (oder Composite) Vector implementiert, der hat grundsätzlich mehrere Funktionen, ist aber selbst ein Feature. Ich habe die Methode drawFeature in Layer.Vector wie vorgeschlagen umgeschrieben, aber jetzt habe ich seltsames Verhalten: Die Features werden korrekt gezeichnet, aber wenn das Ansichtsfenster in der Größe geändert wird, werden die Features doppelt gezeichnet. Ich denke, es kommt darauf an, Features zu haben, die selbst Features haben. Gibt es noch etwas, das ich neu schreiben muss, etwas, das ich nicht vergessen sollte? – dschenk

2

Die vorgeschlagene Lösung von Jon Snyder uns eine allgemeine Idee, aber vollständig am Ende nicht funktioniert hat (vor allem erstreckt OpenLayers.Layer.Vector wasn‘ t notwendig für diese Aufgabe, basierend auf OpenLayers 2.1x).

Wir haben eine Klasse YourApp.Handler.EndPointsPath (OpenLayers.Handler.Path erstreckt), wobei die Funktion geometryClone()YourApp.Geometry.EndPointsPath eine neue Geometrie des Typs zurückgibt.

Wir gepatcht dann die Funktion drawGeometry() in OpenLayers.Renderer.Elements diese neue Geometrie zu zeichnen:

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