0

私は OpenLayers を使い始めたばかりで、小さな障害にぶつかりました。LineString を作成してから変更しようとすると、既存の頂点を移動し、仮想頂点をドラッグして新しい頂点を作成できます。ただし、ラインに追加を続けると、既存の頂点への変更のみが保存され、新しい頂点は破棄されます。何か不足していますか?ここで私が話していることの例を見ることができます:

http://dev.darrenhall.info/temp/open-layers/modify-feature/

クリックしてポイントを追加し、ドットを使用して編集し、クリックして追加を続けて、意味を確認してください。どんな助けでも大歓迎です!ありがとう!

ダレン

4

2 に答える 2

0

ざっと見てみると、コードは本来よりも複雑に見えます。

クリック時に手動でポイントの配列に手動でポイントをプッシュし、それらのポイントでラインストリングを生成します。

仮想頂点で行われた変更をリッスンしません。addWayPoint 関数で、ポイントの配列ではなくレイヤーからフィーチャのジオメトリを取得しない理由がわかりません。

実際のフィーチャ ジオメトリを使用し、route.waypoints の使用を避けるには、これが良いスタートになるかもしれません。

于 2012-07-26T13:14:11.593 に答える
0

最終的に、modifyFeature を使用しないことに決め、代わりにベクトルをハンドルとして使用し、ドラッグと線の変更を手動で処理しました。ここで私の回避策を見ることができます:

http://dev.darrenhall.info/temp/open-layers/draw-route

Ordnance Survey の連中は、変更後に頂点から配列を再設定するものの、私のコードの (かなり単純な) 修正を思い付きました。

function addWayPoint(e) {    
  var position = osMap.getLonLatFromViewPortPx(e.xy);

  if(route.waypoints.length>1) {
        layers.lines.layer.removeFeatures([layers.lines.feature]);
  }

  /* vvvvvvvvvvv start */
  /* Get the potentially modified feature */

  if (modifyFeature.feature) {
      route.waypoints = [];
      var vertices = modifyFeature.feature.geometry.getVertices();

      for (i = 0; i < vertices.length; i++) {
          //console.log(vertices[i]);
          route.waypoints.push(vertices[i]);
      } 
  }

  /* ^^^^^^^^^^^ end */

  route.waypoints.push(new OpenLayers.Geometry.Point(position.lon, position.lat));

  var string = new OpenLayers.Geometry.LineString(route.waypoints);
  layers.lines.feature = new OpenLayers.Feature.Vector(string, null, styles.pink);
  layers.lines.feature.attributes['id']=1;
  layers.lines.layer.addFeatures([layers.lines.feature]);

  for (i = 0; i < layers.lines.layer.features.length; i++) {
        if (layers.lines.layer.features[i].attributes.id == 1) {
              modifyFeature.selectFeature(layers.lines.layer.features[i]);
        }
  }
}
于 2012-08-01T13:24:12.317 に答える