[Users] Need help to dynamically add vector layer to treePanel

David E. Reksten der at dod.no
Tue Sep 21 13:56:31 CEST 2010


Hi,

thank you so much for your answer, I finally got it to work by
cleaning up the code as you suggested and, particularly, setting
"displayInLayerSwitcher: true" was necessary to get it working.

I'm sorry about the confusion with LayerNodeUI. I actually need the
radio buttons (the users should be able to both delete and draw on
specific layers), and LayerNodeUI was defined further up in the code
as such:
    var LayerNodeUI = Ext.extend(
        GeoExt.tree.LayerNodeUI, new GeoExt.tree.RadioButtonMixin()
    );

Again, thank you for your help!

Regards,
.david

2010/9/20 Andreas Hocevar <ahocevar at opengeo.org>:
> Hi,
>
> please see comments inline.
>
>
> On Sep 20, 2010, at 17:02 , David E. Reksten wrote:
>
>> Hi all,
>>
>> after having spent a lot of time trying different strategies, I still
>> can't for the life of me figure out how to dynamically add a vector
>> layer to my layer tree.
>>
>> What I have so far:
>>
>>    mapPanel = new GeoExt.MapPanel({
>>        border: true,
>>        region: "center",
>>        map: new OpenLayers.Map(myMapConfig);,
>>        margins: '0 5 5 0',
>>        layers: [baseLayer1, baseLayer2, baseLayer3]
>>    });
>>
>>    treeConfig = new OpenLayers.Format.JSON().write([{
>
> There is no need to JSON-encode above. In the example where you copied the code from (tree.js) this is only done to allow live-editing of the tree configuration. Use the object directly, don't send it to OpenLayers.Format.JSON.write.
>
>>        nodeType: "gx_baselayercontainer",
>>        text: "Base layers",
>>        expanded: true
>>    }, {
>>        nodeType: "gx_overlaylayercontainer",
>>        text: "My vector layers", // I want the new vector layers to
>> appear here...
>>        expanded: true,
>>        loader: {
>>            baseAttrs: {
>>                radioGroup: "foo",
>>                uiProvider: "use_radio"
>>            }
>
> I doubt that you want radioGroup, and I doubt that you want to use the use_radio uiProvider. See below.
>
>>        }
>>    }], true);
>>
>>    treePanel = new Ext.tree.TreePanel({
>>        id: 'mainpanel',
>>        border: true,
>>        region: "west",
>>        title: "Map layers",
>>        width: 200,
>>        split: true,
>>        collapsible: true,
>>        margins: '0 0 5 5',
>>        collapseMode: "mini",
>>        autoScroll: true,
>>        loader: new Ext.tree.TreeLoader({
>>            applyLoader: false,
>>            uiProviders: {
>>                "use_radio": LayerNodeUI
>>            }
>
> You don't seem to have defined the LayerNodeUI in your code, and you don't need the uiProviders config option. I am pretty sure that using an undefined layer node ui causes your problem.
>
>>        }),
>>        root: {
>>            nodeType: "async",
>>            children: Ext.decode(treeConfig)
>
> Use the treeConfig directly.
>
>>        },
>>        rootVisible: false,
>>        lines: false
>>    });
>>
>> The user is supposed to add one or several named layers (by clicking a
>> button that triggers the following):
>>
>> function addVectorLayer() {
>>    Ext.MessageBox.prompt('New layer', 'Type name for layer:',
>>        function (btn, text) {
>>            if (btn == 'ok') {
>>                var newVectorLayer = new OpenLayers.Layer.Vector(
>>                    text,
>>                    {
>>                        projection: new OpenLayers.Projection("EPSG:4326"),
>>                        displayInLayerSwitcher: false,
>>                        isBaseLayer: false,
>>                        styleMap: new OpenLayers.StyleMap({
>>                            "default": new OpenLayers.Style(
>>                                OpenLayers.Util.applyDefaults({
>>                                    fillColor:"#FF6666",
>>                                    strokeColor: "#FF3333",
>>                                    strokeWidth: 2
>>                                },
>>                                OpenLayers.Feature.Vector.style["default"])
>>                            )
>>                        })
>>                );
>>                // ***** THIS IS WHERE IT FAILS ******
>>                map.addLayer(newVectorLayer); // this works, but does
>> not add the layer to my treePanel
>>                mapPanel.layers.add(newVectorLayer); // ...so I tried
>> this but get an exception
>>            };
>>        }
>>    );
>>
>> };
>>
>> I have looked and looked at the example in
>> http://dev.geoext.org/trunk/geoext/examples/layercontainer.js but
>> still can't get it to work and I guess that I must be missing
>> something basic in how I use these components. For instance, my gut
>> feeling tells me that the treePanel object should probably be told
>> about the mapPanel somewhere, or is there some magic going on behind
>> my back?
>
> Yes, there is some magic going on. If you don't provide a layer store, your tree will use Ext.MapPanel.guess().layers - this only works if your application just has a single map.
>
> Regards,
> Andreas.
>
>>
>> Any help with this is greatly appreciated!
>>
>> Regards,
>> .david
>> _______________________________________________
>> Users mailing list
>> Users at geoext.org
>> http://www.geoext.org/cgi-bin/mailman/listinfo/users
>
>
>
> --
> Andreas Hocevar
> OpenGeo - http://opengeo.org/
> Expert service straight from the developers.
>
>


More information about the Users mailing list