[OpenLayers-Users] ModifyControl Select/Delete Vertex?
Alexandre Dubé
adube at mapgears.com
Fri Mar 1 06:28:06 PST 2013
Just out of curiosity, you could try with OpenLayers trunk (master
branch on GitHub) to see if this issue has already been fixed.
Alexandre
On 13-03-01 09:26 AM, Alexandre Dubé wrote:
> Hey Rob,
>
> Looking deeper, I may have found part of the issue. If you put a
> breakpoint in the OpenLayers.Handler.Feature, line 353 :
>
> if(dpx <= this.clickTolerance) {
> this.callback(key, args);
> }
>
> you'll notice that the feature handler stop at this point. The
> callback method isn't called, thus resulting in our registered 'click'
> callback we made not being fired, nor the original one from the
> DragControl. The dpx is greater than the clickTolerance, that's the
> problem. The 'up' and 'down' positions seem erroneous, and I don't
> understand what's the cause.
>
> I think we'll need an OpenLayers dev answer, but this may be a bug,
> or a consequence of something we do incorrectly.
>
> Regards,
>
> Alexandre
>
>
> On 13-03-01 09:15 AM, Alexandre Dubé wrote:
>> Hi Rob,
>>
>> I look and haven't found what's causing the issue, but here's some
>> updates anyway:
>>
>> You shouldn't set the standalone property after the instantiation
>> of the modify control. If you look at the code, that property is
>> used in the initialize function.
>>
>> I noticed that the DragControl already has a 'click' callback
>> method, so the way I suggested currently overrides it completely.
>> Making the following change makes the chain continue:
>>
>> click: function(feature) {
>> this.layer.events.triggerEvent(
>> "vertexclicked", {feature: feature}
>> )
>> // call the dragControl original click callback method
>> control.dragControl.clickFeature.apply(
>> control.dragControl, [feature]);
>> }
>>
>> Even with the above fix, I notice that the callback method is never
>> triggered. The feature handler is still active though. I don't know
>> what's wrong. This may be an issue in OpenLayers.
>>
>> Regards,
>>
>> Alexandre
>>
>>
>> On 13-03-01 07:26 AM, Robert Smart wrote:
>>> Hi,
>>> I’ve made a start on modifying the code so it does what i need.
>>> However I need it work in standalone mode, and it seems to exhibit
>>> some odd behaviour.
>>> If I start editing and selecting points it all works fine, but if I
>>> click outside of the polygon (it remains editable since it is in
>>> standalone mode)when I go back to the polygon the click event no
>>> longer fires, so I can no longer select a vertex.
>>> Any ideas what might be causing this?
>>> I’ve pasted the page code below. I have not changed the
>>> modifyFeatureVertexSelection code at all except putting it in a
>>> seperate js file.
>>> Thanks,
>>> Rob Smart
>>> <div id="map" style="width:500px; height:500px; " ></div>
>>> <input id="Button4" type="button" value="Delete Selected
>>> Vertex" onclick="deleteSelectedVertex()" />
>>> <script type="text/javascript">
>>> var map, vectors, modify, feature, selectedVertex;
>>> $(document).ready(function () {
>>> map = new OpenLayers.Map('map');
>>> var wms = new OpenLayers.Layer.WMS("OpenLayers WMS",
>>> "http://vmap0.tiles.osgeo.org/wms/vmap0?"
>>> <http://vmap0.tiles.osgeo.org/wms/vmap0?%22>, { layers: 'basic' });
>>> OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
>>> // allow testing of specific renderers via
>>> "?renderer=Canvas", etc
>>> var renderer =
>>> OpenLayers.Util.getParameters(window.location.href).renderer;
>>> renderer = (renderer) ? [renderer] :
>>> OpenLayers.Layer.Vector.prototype.renderers;
>>> var style = $.extend(true, {},
>>> OpenLayers.Feature.Vector.style['default']); // get a copy of the
>>> default style
>>> style.fillColor = "Red";
>>> style.fillOpacity = 1;
>>> var myStyleMap = new OpenLayers.StyleMap({
>>> "temporary": new OpenLayers.Style(style)
>>> });
>>> vectors = new OpenLayers.Layer.Vector("Vector Layer", {
>>> renderers: renderer, styleMap: myStyleMap
>>> });
>>> map.addLayers([wms, vectors]);
>>> feature = new OpenLayers.Feature.Vector(
>>> OpenLayers.Geometry.Polygon.createRegularPolygon(
>>> new OpenLayers.Geometry.Point(0, 0),
>>> 10,
>>> 5
>>> ),
>>> {}
>>> );
>>> vectors.addFeatures([feature]);
>>> if (console && console.log) {
>>> // register a callback function to our new
>>> "vertexclicked" event
>>> vectors.events.on({ "vertexclicked": function report(event) {
>>> console.log(event.type, event.feature.id);
>>> myVertices = feature.geometry.getVertices();
>>> realVertex = false;
>>> //TEST TO SEE IF ITS A REAL VERTEX
>>> for (var i = 0; i < myVertices.length; i++) {
>>> //console.log(myVertices[i]);
>>> if (myVertices[i] == event.feature.geometry) {
>>> realVertex = true; }
>>> //Do something
>>> }
>>> if (realVertex == false) {
>>> console.log("virtualVertex"); return; }
>>> console.log(event.feature)
>>> if (selectedVertex == null) {
>>> selectedVertex = event.feature;
>>> vectors.drawFeature(event.feature, "temporary");
>>> return;
>>> }
>>> if (event.feature == selectedVertex) {
>>> vectors.drawFeature(event.feature, "default");
>>> selectedVertex = null;
>>> return;
>>> }
>>> if (event.feature != selectedVertex) {
>>> vectors.drawFeature(selectedVertex, "default");
>>> selectedVertex = event.feature;
>>> vectors.drawFeature(event.feature, "temporary");
>>> }
>>> // change the color - sure !
>>> // // do more - popup to delete the vertex
>>> // c = [];
>>> // c.push("Selected feature id: ");
>>> // c.push(vectors.selectedFeatures[0].id);
>>> // c.push("\nSelected vertex id: ");
>>> // c.push(event.feature.id);
>>> // c.push("\n\nRemove this vertex?")
>>> // var removeVertex = confirm(c.join(""));
>>> // if (removeVertex) {
>>> // // I noticed that the
>>> ModifyFeature control doesn't have
>>> // // a method to manage a
>>> vertices removal, it's only done inside
>>> // // the 'handleKeypress'
>>> callback method... but it doesn't
>>> // // prevent us from using it :)
>>> so we'll emulate a 'delete' key
>>> // // pressed
>>> // modify.dragControl.feature = event.feature;
>>> // modify.handleKeypress({ keyCode: 46 });
>>> // } else {
>>> // // simply redraw the vertex
>>> back to its default style
>>> // vectors.drawFeature(event.feature, "default");
>>> // }
>>> }
>>> });
>>> }
>>> modify = new
>>> OpenLayers.Control.ModifyFeatureVertexClick(vectors);
>>> modify.standalone = true;
>>> map.addControls([modify]);
>>> modify.activate();
>>> map.setCenter(new OpenLayers.LonLat(0, 0), 3);
>>> // select with a delay to let the map render and apply the
>>> default style
>>> // to the feature, which emulates a selection that would be
>>> made using a
>>> // click on the feature
>>> setTimeout(function () {
>>> modify.selectControl.select(feature);
>>> });
>>> });
>>> function deleteSelectedVertex() {
>>> if (selectedVertex != null) {
>>> modify.dragControl.feature = selectedVertex;
>>> modify.handleKeypress({ keyCode: 46 });
>>> //This works for some of the issues but not all of the them
>>> //vectors.destroyFeatures([selectedVertex])
>>> modify.dragControl.feature = null;
>>> selectedVertex = null;
>>> modify.selectControl.select(feature);
>>> }
>>> }
>>> </script>
>>> *From:* Alexandre Dubé <mailto:adube at mapgears.com>
>>> *Sent:* Thursday, February 28, 2013 7:05 PM
>>> *To:* Robert Smart <mailto:r_n_smart at hotmail.com>
>>> *Cc:* openlayers-users at lists.osgeo.org
>>> <mailto:openlayers-users at lists.osgeo.org>
>>> *Subject:* Re: [OpenLayers-Users] ModifyControl Select/Delete Vertex?
>>> Hi Robert,
>>>
>>> Yep, all the things you ask are quite possible but not without
>>> getting your hand a bit dirty :) You can do all that by
>>> programming. Extend the ModifyControl more to make it do what you
>>> want. Don't be afraid to look at the source code to see what the
>>> components do. You'll get more knowledge that way.
>>>
>>> I'd be happy to see the end result. Best of luck to you.
>>>
>>> Kind regards,
>>>
>>> Alexandre
>>>
>>>
>>>
>>> On 13-02-28 12:36 PM, Robert Smart wrote:
>>>
>>>> This there a way to define a style for the selected vertex?
>>>
>>> Sure. Look at the OpenLayers.Layer.Feature drawFeature method,
>>> second argument.
>>>
>>>
>>>> Is there a way to store a reference to the selected vertex in the
>>>> modify feature control? So that I could allow a user to select a
>>>> vertex and then if they choose to delete it, I can just pull out a
>>>> reference to it in the code from the modify feature. I suppose this
>>>> could also just be a deleteSeletectedVertex function on the
>>>> modifyFeature control too.
>>>
>>> Yep, but you'll need to program that.
>>>
>>>
>>>> Is there a way to deselect the the vertex too? So if I click on it
>>>> and it changes its style to the ‘selected’ style, I can then click
>>>> on it again to deselect it?
>>>
>>> If you keep track of the current one selected, yeah you could. This
>>> is also done programmatically.
>>>
>>>
>>>
>>> --
>>> Alexandre Dubé
>>> Mapgears
>>> www.mapgears.com
>>
>>
>> --
>> Alexandre Dubé
>> Mapgears
>> www.mapgears.com
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/openlayers-users
>
>
> --
> Alexandre Dubé
> Mapgears
> www.mapgears.com
>
>
> _______________________________________________
> Users mailing list
> Users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/openlayers-users
--
Alexandre Dubé
Mapgears
www.mapgears.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/openlayers-users/attachments/20130301/39ff8225/attachment-0001.html>
More information about the Users
mailing list