2010-11-30 8 views
1

Iは次のように作成OpenLayers.Feature.Vectorを有する:異なるスタイルで描画MultiPolygonの

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

両方のポリゴンが、マップ上の同じ論理オブジェクト(「エンティティ」)を表すと言っ雲。このため、私はそれらを1つの機能に保持しています。私はスタイル、スタイルマップを見てとっている

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

:このマルチポリゴン(polygonGeometry1、polygonGeometry2)の各構成要素は、それが層に追加されます別の色で描画されるように 私はそれを描きたいですOpenLayersのルールは不十分だと思われます。それらは、異なるフィーチャ(ベクトル)に属している場合のみ、異なる色で各ジオメトリタイプを描画することができます。この問題を解決する方法はありますか?本当に私はポリゴンごとに別々のVectorを使用する必要がありますか?

答えて

1

私が知る限り、この機能を利用するには、自分でクラスを拡張する必要があります。

まず、OpenLayers.Feature.Vectorの拡張機能を作成し、YourApp.Feature.MultiVectorという名前を付けます。 OpenLayersコードを見てクラスを拡張する方法の例を見ることができます。このクラスは、スタイルの配列とマルチポリゴンを受け入れる必要があります。独自のスタイルを持つOpenLayers.Feature.Vectorsのリストを返すメソッドが必要です。

2番目に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]); 
+0

を。ありがとう! – gregorej

+0

私は、ベクトルのセットを保持するCompositeVectorクラスを実装しました。各ベクトルはそれ自身のジオメトリとオプションでスタイルを持っています。また、これらをサポートする特別なOpenLayers.Layer.Vector実装が必要でした。要約すると:それは働いた:) – gregorej

+0

私はそのような古いスレッドを持って申し訳ありませんが、私は現在(OpenLayers 2.12で)同じを達成しようとしているが問題に遭遇した:私はマルチ(または複合)ベクトルを実装した基本的には複数の機能を備えていますが、機能そのものです。私は、提案されているようにLayer.VectorのdrawFeatureメソッドを書き換えましたが、今私は奇妙な動作をしています:機能は正しく描画されますが、ビューポートのサイズが変更されると、私はそれがすべて、フィーチャーそのものを持つフィーチャーを持つことになると思う。書き換えなければならないものがありますか、忘れてはいけないものがありますか? – dschenk

2

ジョン・スナイダーによって提案された解決策は、一般的なアイデアを提供してくれますが、完全に終了して(特にOpenLayers.Layer.Vectorを拡張するために動作しませんでしたwasn」:

だからあなたのコードは、次のようになります呼び出すためにOpenLayers 2.1xに基づいてこのタスクに必要なもの)。

クラス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...) 
    } 
    } 
}); 
関連する問題