2009年3月21日土曜日

OpenLayers 18e ベクトル図の選択動作

OpenLayers Select Feature Example(select-feature.html) ベクトル図の選択動作
を参考に描画したベクトル図の選択動作を設定します。
(OpenLayers 18d - OpenLayers Measure Example は動作しなかったので次回に version2.7が必要?)

次のコードを追加します。

---
// ここから追加
var vectors = new OpenLayers.Layer.Vector("Vector Layer");
map.addLayer(vectors);

var drawControl;
drawControls = {
point: new OpenLayers.Control.DrawFeature(
vectors, OpenLayers.Handler.Point
),
line: new OpenLayers.Control.DrawFeature(
vectors, OpenLayers.Handler.Path
),
polygon: new OpenLayers.Control.DrawFeature(
vectors, OpenLayers.Handler.Polygon
),
select: new OpenLayers.Control.SelectFeature(
vectors,
{
clickout: false, toggle: false,
multiple: false, hover: false,
toggleKey: "ctrlKey", // ctrl key removes from selection
multipleKey: "shiftKey", // shift key adds to selection
box: true
}
),
selecthover: new OpenLayers.Control.SelectFeature(
vectors,
{
multiple: false, hover: true,
toggleKey: "ctrlKey", // ctrl key removes from selection
multipleKey: "shiftKey" // shift key adds to selection
}
)
};

for(var key in drawControls) {
map.addControl(drawControls[key]);
}
// ここまで
} // End of function init()

function displayZoom() {
document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
}
// ここから追加
function toggleControl(element){
for (key in drawControls) {
var control = drawControls[key];
if (element.value == key && element.checked) {
control.activate();
}
else {
control.deactivate();
}
}
}

function update() {
var clickout = document.getElementById("clickout").checked;
drawControls.select.clickout = clickout;
drawControls.select.box = document.getElementById("box").checked;
if(drawControls.select.active) {
drawControls.select.deactivate();
drawControls.select.activate();
}
}
// ここまで

</script>
</head>
<body onload="init()">
<h1 id="title">Display Data5</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<div id="edpanel" class="olControlEditingToolbar"></div><br />
<div id="panel" style="margin-left:50px;"></div><br />
<div id="coords" style="margin-left:50px;"></div>
<div style="margin-left:50px;">Moving your mouse to the upper left corner of this map should return 'x=0,y=0'</div>
<div style="margin-left:50px;">zoom: <span id="zoom"></span></div>
<div style="margin-left:50px;"><a href="#" onclick="nav.enableZoomWheel();return false">Turn on Wheel Zoom</a> | <a href="#" onclick="nav.disableZoomWheel(); return false;">Turn off Wheel Zoom</a></div>
<!-- ここから追加 -->
<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle"
onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="point" id="pointToggle"
onclick="toggleControl(this);" />
<label for="pointToggle">draw point</label>
</li>
<li>
<input type="radio" name="type" value="line" id="lineToggle"
onclick="toggleControl(this);" />
<label for="lineToggle">draw line</label>
</li>
<li>
<input type="radio" name="type" value="polygon" id="polygonToggle"
onclick="toggleControl(this);" />
<label for="polygonToggle">draw polygon</label>
</li>
<li>
<input type="radio" name="type" value="selecthover" id="selecthoverToggle"
onclick="toggleControl(this);" />
<label for="selecthoverToggle">Select features on hover</label>
</li>
<li>
<input type="radio" name="type" value="select" id="selectToggle"
onclick="toggleControl(this);" />
<label for="selectToggle">select feature</label>
<ul>
<li>
<input id="box" type="checkbox" checked="checked"
name="box" onchange="update()" />
<label for="box">select features in a box</label>
</li>
<li>
<input id="clickout" type="checkbox"
name="clickout" onchange="update()" />
<label for="clickout">click out to unselect features</label>
</li>
</ul>
</li>
</ul>
<!-- ここまで -->
---

"select features in a box" は動作しませんでした。version2.7ならできるかも?

"draw polygon" をクリックして選択し図を描画します。



"Select features on hover" をクリックして選択し図にポインタを合わせると色が変わります。



"click out to unselect features" をクリックして選択し図をクリックすると色が変わります。図以外の場所をクリックすると元の色になります。




描画した図だけ色が変わります。

2009年3月19日木曜日

OpenLayers 18c マウス位置の座標表示をカスタマイズ

Custom Style Example マウス位置の座標表示をカスタマイズ
を参考にマウスポジションの座標表示をカスタマイズします。

次のコードを追加します。

---
/* ここから追加 */
div.olControlMousePosition {
font-family: Verdana; /* ブラウザのフォントの関係で指定通りにならないときもあります */
font-size: 0.5em;
color: red;
}
/* ここまで */
</style>
---
// ここから追加
map.addControl(new OpenLayers.Control.MousePosition());
// ここまで

} // End of function init()
---

OpenLayers 18b Shift+Drag で四角座標表示

Custom Control Example(custom-control.html) Shift+Drag で四角座標表示
を参考に座標表示させます。

OpenLayers 18a で追加したコードは削除してください。
次のコードを追加します。

---
// ここから追加
var control = new OpenLayers.Control();
OpenLayers.Util.extend(control, {
draw: function () {
// this Handler.Box will intercept the shift-mousedown
// before Control.MouseDefault gets to see it
this.box = new OpenLayers.Handler.Box(
control,
{"done": this.notice},
{keyMask: OpenLayers.Handler.MOD_SHIFT});
this.box.activate();
},

notice: function (bounds) {
var ll = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.left, bounds.bottom));
var ur = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.right, bounds.top));
alert(ll.lon.toFixed(4) + ", " +
ll.lat.toFixed(4) + ", " +
ur.lon.toFixed(4) + ", " +
ur.lat.toFixed(4));
}
});

map.addControl(control);
// ここまで

} // End of function init()

地図上を Shift + ドラッグ で座標がポップアップ表示されます。

2009年3月18日水曜日

OpenLayers 18a Shift+Click で座標表示

Custom Control Point Example(custom-control-point.html) Shift+Click で座標表示
を参考に座標表示させます。

次のコードを追加します。

---
// ここから追加
var control = new OpenLayers.Control();
OpenLayers.Util.extend(control, {
draw: function () {
// this Handler.Point will intercept the shift-mousedown
// before Control.MouseDefault gets to see it
this.point = new OpenLayers.Handler.Point(
control,
{"done": this.notice},
{keyMask: OpenLayers.Handler.MOD_SHIFT}
);
this.point.activate();
},

notice: function (bounds) {
document.getElementById('bounds').innerHTML = bounds;
}
});

map.addControl(control);
// ここまで

} // End of function init()
---
</script>
</head>
<body onload="init()">
<h1 id="title">Display Data1</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<!-- ここを追加 -->
<div id="bounds" style="margin-left:50px;"></div><br />
<!-- ここまで -->
---

地図上を Shift + クリック で地図のしたに座標が表示されます。

2009年3月9日月曜日

OpenLayers 17j 描画ツールバー表示

Editing Toolbar Example(editingtoolbar.html) ツールバー表示を参考に描画ツールバーを設定します。

次のコードを追加します。

---
var panel = new OpenLayers.Control.Panel({
div: document.getElementById("panel")
});
panel.addControls([nav.next, nav.previous]);
map.addControl(panel);

// ここから追加
vlayer = new OpenLayers.Layer.Vector("Editable");
map.addLayer(vlayer);
map.addControl(new OpenLayers.Control.EditingToolbar(vlayer));
// ここまで
---


OpenLayers EditingToolbar Outside Viewport(editingtoolbar-outside.html) ツールバーを地図の外に配置を参考に描画ツールバーを設定します。

次のコードを追加します。

---
var panel = new OpenLayers.Control.Panel({
div: document.getElementById("panel")
});
panel.addControls([nav.next, nav.previous]);
map.addControl(panel);

// ここから追加
vlayer = new OpenLayers.Layer.Vector("Editable");
map.addLayer(vlayer);
var container = document.getElementById("edpanel");
var edpanel = new OpenLayers.Control.EditingToolbar(
vlayer, {div: container}
);
map.addControl(edpanel);
// ここまで
---
<body onload="init()">
<h1 id="title">Drawing Vector Feature9</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<!-- ここを追加 -->
<div id="edpanel" class="olControlEditingToolbar"></div><br />
<!-- ここまで -->
---

theme/default/style.css の .olControlEditingToolbar の内容を次のように修正します。

.olControlEditingToolbar {
/* float:right; 削除 */
right: 0px;
height: 30px;
width: 200px;
}

2009年3月8日日曜日

OpenLayers 17i フューチャーを自動的に回転

Rotate vector features(rotate-features.html) フューチャーを自動的に回転
を参考にします。

次のようにコードを追加します。
openlayers17hで追加したコードは削除してください。

---
// we want opaque external graphics and non-opaque internal graphics
var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
layer_style.fillOpacity = 0.2;
layer_style.graphicOpacity = 1;

/*
* Blue style
*/
var style_blue = OpenLayers.Util.extend({}, layer_style);
style_blue.strokeColor = "blue";
style_blue.fillColor = "blue";

/*
* Green style
*/
var style_green = {
strokeColor: "#00FF00",
strokeWidth: 3,
pointRadius: 6,
pointerEvents: "visiblePainted"
};

var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {style: layer_style});

// create a point feature
var point = new OpenLayers.Geometry.Point(-28000, -76000);
var pointFeature = new OpenLayers.Feature.Vector(point,null,style_blue);
var point2 = new OpenLayers.Geometry.Point(-27000, -76000);
var pointFeature2 = new OpenLayers.Feature.Vector(point2,null,style_green);

// create a line feature from a list of points
var pointList = [];
newPoint = new OpenLayers.Geometry.Point(-25000,-73000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-26000,-74000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-27000,-75000);
pointList.push(newPoint);
var lineFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.LineString(pointList),null,style_green);

// create a polygon feature from a linear ring of points
var pointList = [];
newPoint = new OpenLayers.Geometry.Point(-28000,-73000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-29500,-74000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-30000,-75000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-28500,-74500);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-27500,-73500);
pointList.push(newPoint);

var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
var polygonFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Polygon([linearRing]));

map.addLayer(vectorLayer);
vectorLayer.addFeatures([pointFeature, pointFeature2, lineFeature, polygonFeature]);

var boxes = new OpenLayers.Layer.Boxes("boxes");
//Draw divs as ‘boxes’ on the layer.
var bounds = new OpenLayers.Bounds(-29000, -72000, -28000, -71000);
var box = new OpenLayers.Marker.Box(bounds);

boxes.addMarker(box);
map.addLayer(boxes);

var boxes2 = new OpenLayers.Layer.Vector( "Boxes" );
var bounds2 = new OpenLayers.Bounds(-27000, -72000, -26000, -71000);
var box2 = new OpenLayers.Feature.Vector(bounds2.toGeometry());
//Create a new polygon geometry based on this bounds.

boxes2.addFeatures(box2);
map.addLayer(boxes2);
// ここから追加
// start rotating
var origin = new OpenLayers.Geometry.Point(-26000, -74000); //修正
var style = {
strokeColor: "#666666",
strokeOpacity: 1,
strokeWidth: 1,
pointRadius: 2,
pointerEvents: "visiblePainted"
};
var center = new OpenLayers.Feature.Vector(origin, null, style);
vectorLayer.addFeatures([center]);
window.setInterval(rotateFeature, 100, pointFeature, 360 / 20, origin);
window.setInterval(rotateFeature, 100, lineFeature, 360 / 40, origin);
window.setInterval(rotateFeature, 100, polygonFeature, -360 / 20, origin);
}

function rotateFeature(feature, angle, origin) {
feature.geometry.rotate(angle, origin);
feature.layer.drawFeature(feature);
} // function init() の最後
// ここまで

function displayZoom() {
 document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
}
---

OpenLayers 17h 描画した図のプロパティをポップアップ

Open Popup on Layer.Vector(select-feature-openpopup.html) 描画した図のプロパティをポップアップ
を参考にします。

次のようにコードを追加します。
openlayers17gで追加したコードは削除してください。

---
<script type="text/javascript">
var popup;
var map = null;
var layer1, layer3, layer4, layer5, layer6, layer7, layer8;
// layer2, , layer9, layer10
var running = false;
var extent = new OpenLayers.Bounds(-31337.715508,-77650.134635,-21796.513842,-70055.061952);

// ここから追加
var drawControls, selectControl, selectedFeature;
function onPopupClose(evt) {
selectControl.unselect(selectedFeature);
}
function onFeatureSelect(feature) {
selectedFeature = feature;
popup = new OpenLayers.Popup.FramedCloud(
"chicken",
feature.geometry.getBounds().getCenterLonLat(),
null,
"<div style='font-size:.8em'>Feature: " + feature.id +"<br />Area: " + feature.geometry.getArea()+"</div>",
null,
true,
onPopupClose
);
feature.popup = popup;
map.addPopup(popup);
}
function onFeatureUnselect(feature) {
map.removePopup(feature.popup);
feature.popup.destroy();
feature.popup = null;
}
// ここまで
---
// ここから追加
var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");

map.addLayer(polygonLayer); // 修正
// map.addControl(new OpenLayers.Control.LayerSwitcher()); 削除
// map.addControl(new OpenLayers.Control.MousePosition()); 削除

selectControl = new OpenLayers.Control.SelectFeature(
polygonLayer,{
onSelect: onFeatureSelect,
onUnselect: onFeatureUnselect
});
drawControls = {
polygon: new OpenLayers.Control.DrawFeature(
polygonLayer,
OpenLayers.Handler.Polygon
),
select: selectControl
};

for(var key in drawControls) {
map.addControl(drawControls[key]);
}

// map.setCenter(new OpenLayers.LonLat(0, 0), 3); 削除
// ここまで

} // function init() の最後

function displayZoom() {
document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
}

// ここから追加
function toggleControl(element) {
for(key in drawControls) {
var control = drawControls[key];
if(element.value == key && element.checked) {
control.activate();
} else {
control.deactivate();
}
}
}
// ここまで
</script>
</head>
<body onload="init()">
<h1 id="title">Drawing Vector Feature6</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<div id="panel" style="margin-left:50px;"></div><br />
<div id="coords" style="margin-left:50px;"></div>
<div style="margin-left:50px;">Moving your mouse to the upper left corner of this map should return 'x=0,y=0'</div>
<div style="margin-left:50px;">zoom: <span id="zoom"></span></div>
<!-- ここから追加 -->
<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle" onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
<label for="polygonToggle">draw polygon</label>
</li>
<li>
<input type="radio" name="type" value="select" id="selectToggle" onclick="toggleControl(this);" />
<label for="selectToggle">select polygon on click</label>
</li>
</ul>
<!-- ここまで -->
---

最初に、"draw polygon" をクリックして選択し、図を描画します。



次に、"select polygon on clicke" をクリックして選択します。
図をクリックすると選択されて紫になり、ポップアップが表示されます。
内容は Area (面積)です。

2009年3月7日土曜日

OpenLayers 17g 描画した図を変形

OpenLayers Modify Feature Example(modify-feature.html) 描画した図を変形
を参考に描画した図を変形します。

次のようにコードを追加します。
openlayers17fで追加したコードは削除してください。

---
<script type="text/javascript">
---
var vectors, controls; //追加
---

// ここから追加
OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
vectors = new OpenLayers.Layer.Vector("Vector Layer");

map.addLayer(vectors); // 修正
// map.addControl(new OpenLayers.Control.LayerSwitcher());
// map.addControl(new OpenLayers.Control.MousePosition());

var modifyOptions = {
onModificationStart: function(feature) {
OpenLayers.Console.log("start modifying", feature.id);
},
onModification: function(feature) {
OpenLayers.Console.log("modified", feature.id);
},
onModificationEnd: function(feature) {
OpenLayers.Console.log("end modifying", feature.id);
},
onDelete: function(feature) {
OpenLayers.Console.log("delete", feature.id);
}
};
controls = {
point: new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.Point),
line: new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.Path),
polygon: new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.Polygon),
regular: new OpenLayers.Control.DrawFeature(vectors, OpenLayers.Handler.RegularPolygon, {handlerOptions: {sides: 5}}),
modify: new OpenLayers.Control.ModifyFeature(vectors, modifyOptions)
};

for(var key in controls) {
map.addControl(controls[key]);
}

// map.setCenter(new OpenLayers.LonLat(0, 0), 3);
document.getElementById('noneToggle').checked = true;

// ここまで

} // function init() の最後

function displayZoom() {
document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
}

// ここから追加
function update() {
// reset modification mode
controls.modify.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
var rotate = document.getElementById("rotate").checked;
if(rotate) {
controls.modify.mode |= OpenLayers.Control.ModifyFeature.ROTATE;
}
var resize = document.getElementById("resize").checked;
if(resize) {
controls.modify.mode |= OpenLayers.Control.ModifyFeature.RESIZE;
}
var drag = document.getElementById("drag").checked;
if(drag) {
controls.modify.mode |= OpenLayers.Control.ModifyFeature.DRAG;
}
// disable reshape mode if at least one of modes rotate, resize, drag is enabled
if (rotate || resize || drag) {
controls.modify.mode &= ~OpenLayers.Control.ModifyFeature.RESHAPE;
}
var sides = parseInt(document.getElementById("sides").value);
sides = Math.max(3, isNaN(sides) ? 0 : sides);
controls.regular.handler.sides = sides;
var irregular = document.getElementById("irregular").checked;
controls.regular.handler.irregular = irregular;
}

function toggleControl(element) {
for(key in controls) {
var control = controls[key];
if(element.value == key && element.checked) {
control.activate();
} else {
control.deactivate();
}
}
}
// ここまで
</script>
</head>
<body onload="init()">
<h1 id="title">Drawing Vector Feature5</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<div id="panel" style="margin-left:50px;"></div><br />
<div id="coords" style="margin-left:50px;"></div>
<div style="margin-left:50px;">Moving your mouse to the upper left corner of this map should return 'x=0,y=0'</div>
<div style="margin-left:50px;">zoom: <span id="zoom"></span></div>
<!-- ここから追加 -->
<div id="controls">
<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle" onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
<label for="pointToggle">draw point</label>
</li>
<li>
<input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
<label for="lineToggle">draw line</label>
</li>
<li>
<input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
<label for="polygonToggle">draw polygon</label>
</li>
<li>
<input type="radio" name="type" value="regular" id="regularToggle" onclick="toggleControl(this);" />
<label for="regularToggle">draw regular polygon</label>
<label for="sides"> - sides</label>
<input id="sides" type="text" size="2" maxlength="2" name="sides" value="5" onchange="update()" />
<ul>
<li>
<input id="irregular" type="checkbox" name="irregular" onchange="update()" />
<label for="irregular">irregular</label>
</li>
</ul>
</li>
<li>
<input type="radio" name="type" value="modify" id="modifyToggle" onclick="toggleControl(this);" />
<label for="modifyToggle">modify feature</label>
<ul>
<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>
</li>
<li>
<input id="drag" type="checkbox" name="drag" onchange="update()" />
<label for="drag">allow dragging</label>
</li>
</ul>
</li>
</ul>
</div>
<!-- ここまで -->
---

最初に、"draw polygon" をクリックして選択し、図を描画します。



次に、"modify feature" をクリックして選択し、"allow rotate" をクリックしてチェックします。


図をクリックすると選択されて紫になり、黄土色のマウイハンドルが表示されます。
これをドラッグして図を回転させます。


同じように、"allow resize"、"allow dragging" をチェックすると図のようにハンドルが表示されて、拡大・縮小やドラッグができます。


2009年3月5日木曜日

OpenLayers 17f 図をリンクで拡大/縮小

Resize Features Programatically(resize-features.html) 図をリンクで拡大縮小
を参考に描画した図をリンクで拡大縮小します。

次のようにコードを追加します。
openlayers17eで追加したコードは削除してください。

---
<script type="text/javascript">
---
var vectorLayer, pointFeature, lineFeature, polygonFeature;
---
function init() {
---

// ここから追加
var style_blue = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
style_blue.strokeColor = "blue";
style_blue.fillColor = "blue";
var style_green = {
strokeColor: "#339933",
strokeOpacity: 1,
strokeWidth: 3,
pointRadius: 6,
pointerEvents: "visiblePainted"
};

vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry");

// create a point feature
var point = new OpenLayers.Geometry.Point(-26566, -73852); //修正
pointFeature = new OpenLayers.Feature.Vector(point, null, style_blue);

// create a line feature from a list of points
var pointList = [];
var newPoint = point;
for(var p=0; p<5; ++p) {
newPoint = new OpenLayers.Geometry.Point(
newPoint.x + Math.random(1)*500,
newPoint.y + Math.random(1)*500
);
pointList.push(newPoint);
}
lineFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(pointList),null,style_green);

// create a polygon feature from a linear ring of points
var pointList = [];
for(var p=0; p<6; ++p) {
var a = p * (2 * Math.PI) / 7;
var r = Math.random(1) + 1;
var newPoint = new OpenLayers.Geometry.Point(
point.x + (r * Math.cos(a)*500), //units(マップ単位)が meter(メータ)なのでこの地図では500倍しました*1
point.y + (r * Math.sin(a)*500) //*1
);
pointList.push(newPoint);
}
pointList.push(pointList[0]);

var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
polygonFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([linearRing]));

map.addLayer(vectorLayer);
// map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5); 削除
vectorLayer.addFeatures([pointFeature, lineFeature, polygonFeature]);
// ここまで

} //function init() の最後

function displayZoom() {
 document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
}

// ここから追加
var origin = new OpenLayers.Geometry.Point(-26666, -73752); //修正
function resizeFeatures(scale) {
pointFeature.geometry.resize(scale, origin);
lineFeature.geometry.resize(scale, origin);
polygonFeature.geometry.resize(scale, origin);
vectorLayer.redraw();
}
// ここまで
</script>
</head>
<body onload="init()">
<h1 id="title">Drawing Vector Feature4</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<div id="panel" style="margin-left:50px;"></div><br />
<div id="coords" style="margin-left:50px;"></div>
<div style="margin-left:50px;">Moving your mouse to the upper left corner of this map should return 'x=0,y=0'</div>
<div style="margin-left:50px;">zoom: <span id="zoom"></span></div>
<!-- ここから追加 -->
<p>Make the features <a href="javascript: resizeFeatures(1.5);">bigger</a>
or <a href="javascript: resizeFeatures(1 / 1.5);">smaller</a>.
<!-- ここまで -->
---




図のように、"bigger"、"smaller" リンクをクリックすると地図上の表示ごとにランダムに描画された図が拡大・縮小します。

OpenLayers 17e 設定後ドラッグして描画

OpenLayers Regular Polygon Example(regular-polygons.html) 設定後ドラッグして描画
を参考に描画方法を設定して図を描画できるようにします。

次のようにコードを追加します。
openlayers17dで追加したコードは削除してください。

---
// ここから追加
var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");

map.addLayer(polygonLayer);

polyOptions = {sides: 4};
polygonControl = new OpenLayers.Control.DrawFeature(
polygonLayer,
OpenLayers.Handler.RegularPolygon,
{handlerOptions: polyOptions}
);

map.addControl(polygonControl);

document.getElementById('noneToggle').checked = true;
document.getElementById('irregularToggle').checked = false;
// ここまで

} // function init() の最終行

function displayZoom() {
 document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
}

// ここから追加
function setOptions(options) {
polygonControl.handler.setOptions(options);
}
function setSize(fraction) {
var radius = fraction * map.getExtent().getHeight();
polygonControl.handler.setOptions({radius: radius, angle: 0});
}
// ここまで

</script>
</head>
<body onload="init()">
<h1 id="title">Drawing Vector Feature2</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<div id="panel" style="margin-left:50px;"></div><br />
<div id="coords" style="margin-left:50px;"></div>
<div style="margin-left:50px;">Moving your mouse to the upper left corner of this map should return 'x=0,y=0'</div>
<div style="margin-left:50px;">zoom: <span id="zoom"></span></div>
<!-- ここから追加 -->
<div id="config"><!-- id は CSS に対応してますが、今回は省略しています。 -->
<ul id="controls"><b>Map Controls</b>
<li>
<input type="radio" name="type"
value="none" id="noneToggle"
onclick="polygonControl.deactivate()"
checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type"
value="polygon" id="polygonToggle"
onclick="polygonControl.activate()" />
<label for="polygonToggle">draw polygon</label>
</li>
</ul>
<table id="options">
<tbody>
<tr>
<th>Draw Option</th>
<th>Value</th>
</tr>
<tr>
<td>
shape
</td>
<td>
<select name="sides" onchange="setOptions({sides: parseInt(this.value)})">
<option value="3">triangle</option>
<option value="4" selected="selected">square</option>
<option value="5">pentagon</option>
<option value="6">hexagon</option>
<option value="40">circle</option>
</select>
</td>
</tr>
<tr>
<td>
snap angle
</td>
<td>
<select name="angle" onchange="setOptions({snapAngle: parseFloat(this.value)})">
<option value="" selected="selected">no snap</option>
<option value="15">15°</option>
<option value="45">45°</option>
<option value="90">90°</option>
</select>
</td>
</tr>
<tr>
<td>
size
</td>
<td>
<select name="size" onchange="setSize(parseFloat(this.value))">
<option value="" selected="selected">variable</option>
<option value="0.1">small</option>
<option value="0.2">medium</option>
<option value="0.4">large</option>
</select>
</td>
</tr>
<tr>
<td>
irregular
</td>
<td>
<input id="irregularToggle" name="irregular" type="checkbox" onchange="setOptions({irregular: this.checked})") />
</td>
</tr>
</tbody>
</table>
</div>
<!-- ここまで -->
---




図のように "Map Controls" の "draw polygon" をクリックして選択し、"Draw Option Value" の "shape"、"snap angle"、"size" をプルダウンメニューから選択します。
地図上をドラッグして図を描画します。

2009年3月4日水曜日

OpenLayers 17d 描画した図をドラッグ

Drag Feature Example(drag-feature.html) 描画をドラッグ
を参考に、描画した図をドラッグできるようにします。

次のようにコードを追加、修正します。
openlayers17a、openlayers17bで追加・修正したコードは削除してください。

---

/* ここを削除
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");
var lineLayer = new OpenLayers.Layer.Vector("Line Layer");
var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
*/
vectors = new OpenLayers.Layer.Vector("Vector Layer"); //ここを追加
// map.addLayers([pointLayer, lineLayer, polygonLayer]);
map.addLayer(vectors); //ここを追加

// var options = {handlerOptions: {freehand: true}};
drawControls = {
// ここから修正
point: new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.Point),
line: new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.Path),
polygon: new OpenLayers.Control.DrawFeature(vectors,OpenLayers.Handler.Polygon),
// ここまで
drag: new OpenLayers.Control.DragFeature(vectors) //ここを追加
};
---

<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle"
onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
<label for="pointToggle">draw point</label>
</li>
 <li>
<input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
  <label for="lineToggle">draw line</label>
 </li>
 <li>
  <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
  <label for="polygonToggle">draw polygon</label>
 </li>
// ここから追加
<li>
<input type="radio" name="type" value="drag" id="dragToggle"
onclick="toggleControl(this);" />
<label for="dragToggle">drag feature</label>
</li>
// ここまで
</ul>
---

図のように "draw polygon" をクリックして選択し、地図上をクリックして図を描画します。
最後はダブルクリックで終了。




次に "drag feature" をクリックして選択し、描画した図をドラッグして移動します。


2009年3月3日火曜日

OpenLayers 17c クリックまたはドラッグで描画

OpenLayers Draw Feature Example(draw-feature.html) クリックまたはドラッグで点、線、ポリゴンを描画 を参考にベクトル図を描画できるようにします。

最初に、ポイントを描画できるようにしてみます。
次のコードを追加します。

---
var drawControls;
OpenLayers.Util.onImageLoadErrorColor = "transparent";
//The color tiles with load errors will turn.

function init(){
---

var pointLayer = new OpenLayers.Layer.Vector("Point Layer");

map.addLayer(pointLayer);

// var options = {handlerOptions: {freehand: true}};
drawControls = {
point: new OpenLayers.Control.DrawFeature(pointLayer,OpenLayers.Handler.Point)
};

for(var key in drawControls) {
map.addControl(drawControls[key]);
}

document.getElementById('noneToggle').checked = true;

} //End of function init()

---

function toggleControl(element) {
for(key in drawControls) {
var control = drawControls[key];
if(element.value == key && element.checked) {
control.activate();
} else {
control.deactivate();
}
}
}
</script>
<body init()>
<h1 id="title">Drawing Vector Feature2</h1>
<div id="layerswitcher" style="position:absolute; z-index:1;"></div>
<div id="map"></div>
<div id="paneldiv" class="olControlNavToolbar"></div>
<div id="panel" style="margin-left:50px;"></div><br />
<div id="coords" style="margin-left:50px;"></div>
<div style="margin-left:50px;">Moving your mouse to the upper left corner of this map should return 'x=0,y=0'</div>
<div style="margin-left:50px;">zoom: <span id="zoom"></span></div>
// ここから追加
<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle"
onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
<label for="pointToggle">draw point</label>
</li>
</ul>
// ここまで
---

"draw point" のラジオボタンをクリックしてチェックし、地図上をクリックするとポイントが描画されます。



次に、ラインとポリゴンが描画できるようにします。
次のようにコードを追加します。

---
var pointLayer = new OpenLayers.Layer.Vector("Point Layer");
var lineLayer = new OpenLayers.Layer.Vector("Line Layer"); //ここを追加
var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer"); //ここを追加

// map.addLayer(pointLayer);
map.addLayers([pointLayer, lineLayer, polygonLayer]); //ここを追加

var options = {handlerOptions: {freehand: true}}; //ここを追加 フリーハンドで描画
drawControls = {
point: new OpenLayers.Control.DrawFeature(pointLayer,OpenLayers.Handler.Point),
line: new OpenLayers.Control.DrawFeature(lineLayer,OpenLayers.Handler.Path, options), //ここを追加
polygon: new OpenLayers.Control.DrawFeature(polygonLayer,OpenLayers.Handler.Polygon, options) //ここを追加
};
---

<ul id="controlToggle">
<li>
<input type="radio" name="type" value="none" id="noneToggle"
onclick="toggleControl(this);" checked="checked" />
<label for="noneToggle">navigate</label>
</li>
<li>
<input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
<label for="pointToggle">draw point</label>
</li>
// ここから追加
  <li>
   <input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
   <label for="lineToggle">draw line</label>
  </li>
  <li>
   <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
   <label for="polygonToggle">draw polygon</label>
  </li>
// ここまで
</ul>
---

ラインとポリゴンはドラッグしてフリーハンドで描画されます。

OpenLayers 17b ベクトル図ボックスの表示

Setting a Visual Extent (setextent.html)ベクトル図ボックス表示
Boxes Example (boxes.html, boxes-vector.html)ベクトル図ボックス表示
を参考にBoxベクトル図を描画します。

1つのボックスを描画します。
次のコードを追加します。

---
var boxes = new OpenLayers.Layer.Boxes("boxes");
//Draw divs as ‘boxes’ on the layer.
var bounds = new OpenLayers.Bounds(-29000, -72000, -28000, -71000);
var box = new OpenLayers.Marker.Box(bounds);

boxes.addMarker(box);
map.addLayer(boxes);
} //function init() の最後
---



または、

---
var boxes2 = new OpenLayers.Layer.Vector( "Boxes" );
var bounds2 = new OpenLayers.Bounds(-27000, -72000, -26000, -71000);
var box2 = new OpenLayers.Feature.Vector(bounds2.toGeometry());
//Create a new polygon geometry based on this bounds.

boxes2.addFeatures(box2);
map.addLayer(boxes2);
} //function init() の最後
---

2009年3月2日月曜日

OpenLayers 17a ベクトル図の描画

Drawing Simple Vector Features Example(vector-features.html) を参考にベクトル図を描画します。

2つの点を描画します。
次のコードを追加します。

---
// 図の基本プロパティ
var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
layer_style.fillOpacity = 0.2; // 内側の透明度
layer_style.graphicOpacity = 1; // 図全体の透明度

// Blue style このスタイル(青)を使ったときのプロパティ
var style_blue = OpenLayers.Util.extend({}, layer_style);
style_blue.strokeColor = "blue"; // 外周の色
style_blue.fillColor = "blue"; // 内側の色

// Green style このスタイル(緑)を使ったときのプロパティ
var style_green = {
strokeColor: "#00FF00",
strokeWidth: 3, // 外周の太さ
pointRadius: 6, // 半径
pointerEvents: "visiblePainted" // この意味は調査中
};

var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {style: layer_style});

// create a point feature 2つの点の位置とプロパティ
var point = new OpenLayers.Geometry.Point(-28000, -76000);
var pointFeature = new OpenLayers.Feature.Vector(point,null,style_blue);
var point2 = new OpenLayers.Geometry.Point(-27000, -76000);
var pointFeature2 = new OpenLayers.Feature.Vector(point2,null,style_green);

// レイヤの追加と描画する図の指定
map.addLayer(vectorLayer);
vectorLayer.addFeatures([pointFeature, pointFeature2]);

} //function init() の最後
---



線を描画してみます。
点を設定して、それを線で結ぶようにします。
次のコードを追加します。

---
// create a point feature
var point = new OpenLayers.Geometry.Point(-28000, -76000);
var pointFeature = new OpenLayers.Feature.Vector(point,null,style_blue);
var point2 = new OpenLayers.Geometry.Point(-27000, -76000);
var pointFeature2 = new OpenLayers.Feature.Vector(point2,null,style_green);

// ここから
// create a line feature from a list of points 点の設定
var pointList = [];
newPoint = new OpenLayers.Geometry.Point(-25000,-73000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-26000,-74000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-27000,-75000);
pointList.push(newPoint);

var lineFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.LineString(pointList),null,style_green);
// ここまで

map.addLayer(vectorLayer);
vectorLayer.addFeatures([pointFeature, pointFeature2, lineFeature]);

} //function init() の最後
---



多角形を描画してみます。
点を設定して、それを線で結ぶようにします。
次のコードを追加します。

---
var lineFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.LineString(pointList),null,style_green);

// ここから
// create a polygon feature from a linear ring of points
var pointList = [];
newPoint = new OpenLayers.Geometry.Point(-28000,-73000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-29500,-74000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-30000,-75000);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-28500,-74500);
pointList.push(newPoint);
newPoint = new OpenLayers.Geometry.Point(-27500,-73500);
pointList.push(newPoint);

var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
var polygonFeature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Polygon([linearRing]));
// ここまで
vectorLayer.addFeatures([pointFeature, pointFeature2, lineFeature, polygonFeature]);

} //function init() の最後
---