[OpenLayers-Users] ModifyControl Select/Delete Vertex?

Alexandre Dubé adube at mapgears.com
Fri Mar 1 06:26:56 PST 2013


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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/openlayers-users/attachments/20130301/1bb3d05a/attachment-0001.html>


More information about the Users mailing list