2014年1月14日火曜日

33 - マウスでフィーチャを描画 4 - ポリゴン(多角形)を変形する

33-4 ポリゴン(多角形)を変形する
examples フォルダにある「OpenLayers Modify Feature Example(modify-feature.html)」を参考に マウスで移動してみます。
「ol014-nippon_bmi_akiruno_pgis.html」 ファイルを続けて使います。

a メニューの「ファイル」->「開く」をクリックします。







b 「ファイルを開く」ウィンドウで、「OpenLayers-2.13.1」->「examples」->「modify-feature.html」をクリックして選択し、「OK」ボタンをクリックします。






c 次のように「modify-feature.html」の内容の一部をコピーして「ol014-nippon_bmi_akiruno_pgis.html」に貼り付け、修正します。
---
  <link rel="stylesheet" href="OpenLayers-2.13.1/theme/default/style.css" type="text/css">
  <link rel="stylesheet" href="OpenLayers-2.13.1/examples/style.css" type="text/css">
  <style type="text/css">
/* ここから追加 */
   #controls {
    width: 512px;
   }
   #controlToggle {
    padding-left: 1em;
   }
/* ここまで */
   #controlToggle li {
    list-style: none;
   }
   p {
    width: 512px;
   }
   /* avoid pink tiles */
   .olImageLoadError {
    background-color: transparent !important;
   }
  </style>
  <title>WMS Example BMI Akiruno PGIS2</title>
---
     map.addLayers([layer0, layer3, layer1, layer2, layer4, vectors]);
// ここから追加
     if (console && console.log) {
      function report(event) {
       console.log(event.type, event.feature ? event.feature.id : event.components);
      }
      vectors.events.on({
       "beforefeaturemodified": report,
       "featuremodified": report,
       "afterfeaturemodified": report,
       "vertexmodified": report,
       "sketchmodified": report,
       "sketchstarted": report,
       "sketchcomplete": report
      });
     }
// ここまで
     drawControls = {
      polygon: new OpenLayers.Control.DrawFeature(
       vectors, OpenLayers.Handler.Polygon),
      drag1: new OpenLayers.Control.DragFeature( // "drag" を "drag1" に修正
       vectors,
       {
        onStart: startDrag,
        onDrag: doDrag,
        onComplete: endDrag
       }
      ),
      modify: new OpenLayers.Control.ModifyFeature(vectors), // 追加
      select: new OpenLayers.Control.SelectFeature(
       vectors,
---
   function update() {
    var clickout = document.getElementById("clickout").checked;
    if(clickout != drawControls.select.clickout) {
     drawControls.select.clickout = clickout;
    }
// ここから追加 "controls" を "drawControls" に修正
    // reset modification mode
    drawControls.modify.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
    var rotate = document.getElementById("rotate").checked;
    if(rotate) {
        drawControls.modify.mode |= OpenLayers.Control.ModifyFeature.ROTATE;
    }
    var resize = document.getElementById("resize").checked;
    if(resize) {
        drawControls.modify.mode |= OpenLayers.Control.ModifyFeature.RESIZE;
        var keepAspectRatio = document.getElementById("keepAspectRatio").checked;
        if (keepAspectRatio) {
            drawControls.modify.mode &= ~OpenLayers.Control.ModifyFeature.RESHAPE;
        }
    }
    var drag = document.getElementById("drag").checked;
    if(drag) {
        drawControls.modify.mode |= OpenLayers.Control.ModifyFeature.DRAG;
    }
    if (rotate || drag) {
        drawControls.modify.mode &= ~OpenLayers.Control.ModifyFeature.RESHAPE;
    }
    drawControls.modify.createVertices = document.getElementById("createVertices").checked;
    var sides = parseInt(document.getElementById("sides").value);
    sides = Math.max(3, isNaN(sides) ? 0 : sides);
    drawControls.regular.handler.sides = sides;
    var irregular =  document.getElementById("irregular").checked;
    drawControls.regular.handler.irregular = irregular;
// ここまで     
   var box = document.getElementById("box").checked;
    if(box != drawControls.select.box) {
     drawControls.select.box = box;
     if(drawControls.select.active) {
      drawControls.select.deactivate();
      drawControls.select.activate();
     }
    }
   }
  </script>
 </head>
 <body onload="init()">
---
  <div id="controls"> <!-- 追加 -->
  <ul id="controlToggle">
---
<!-- "drag" を "drag1" に修正 -->
 <li>
   <input type="radio" name="type" value="drag1" id="dragToggle" onclick="toggleControl(this);" />
   <label for="dragToggle">drag feature</label>
 </li>
---
<!-- ここから追加 -->
  <li>
   <input type="radio" name="type" value="modify" id="modifyToggle" onclick="toggleControl(this);" />
   <label for="modifyToggle">modify feature</label>
   <ul>
    <li>
     <input id="createVertices" type="checkbox" checked name="createVertices" onchange="update()" />
     <label for="createVertices">allow vertices creation</label>
    </li>
    <li>
     <input id="rotate" type="checkbox" name="rotate" onchange="update()" />
     <label for="rotate">allow rotation</label>
    </li>
    <li>
     <input id="resize" type="checkbox" name="resize" onchange="update()" />
     <label for="resize">allow resizing</label>
     (<input id="keepAspectRatio" type="checkbox" name="keepAspectRatio" onchange="update()" checked="checked" />
     <label for="keepAspectRatio">keep aspect ratio</label>)
    </li>
    <li>
     <input id="drag" type="checkbox" name="drag" onchange="update()" />
     <label for="drag">allow dragging</label>
    </li>
   </ul>
  </li>
<!--  ここまで -->
  </ul>
  </div> <!-- 追加 -->
 </body>
</html>
modify feature
 allow vertices creation: 角数を増やす(他のオプションと同時に動作しません)









 allow rotation: 点をドラッグして回転させる










 allow resizing: 点をドラッグして大きさを変える
 (keep aspect ratio: 比率を変えない)









 allow dragging: 点をドラッグして移動させる
(このドラッグでは複数のフィーチャを同時に移動する方法が見つかりませんでした。)

0 件のコメント: