[OpenLayers-Users] Visibility of features in vector layer
[SEC=UNCLASSIFIED]
Matthew Doyle
M.Doyle at bom.gov.au
Sun Jul 12 21:07:32 EDT 2009
Thank you Andreas, my features are now working perfectly.
For those interested in the final solution; I used Layer.Vector with a Fixed strategy. Once this was set up correctly I was able to modify the renderIntent parameter of each feature to toggle them on and off appropriately.
var vectorLayer = new OpenLayers.Layer.Vector("Pacific Stations", {
strategies: [new OpenLayers.Strategy.Fixed()],
styleMap: pacificStyleMap,
protocol: new OpenLayers.Protocol.HTTP({
url: "...",
format: new OpenLayers.Format.GML()
})
});
Big thanks to all who responded and helped,
Best regards,
Matt
-----Original Message-----
From: Andreas Hocevar [mailto:ahocevar at opengeo.org]
Sent: Saturday, 11 July 2009 7:17 AM
To: Matthew Doyle; users
Subject: Re: [OpenLayers-Users] Visibility of features in vector layer [SEC=UNCLASSIFIED]
Matthew Doyle wrote:
> Thanks Andreas! Should I be using Layer.Vector instead then?
Either Layer.Vector with a Fixed strategy, or, if you do not want to change a lot of code, just use Layer.GML instead of Layer.WFS. But the disadvantage is that it will load all features from your server, which will be slow if you have more than ~100 features.
Regards,
Andreas.
> I'll give the stylemap-context a go first and let you know how I get on. Thanks again.
>
> Cheers,
> Matt
>
> -----Original Message-----
> From: andreas.hocevar at gmail.com [mailto:andreas.hocevar at gmail.com] On
> Behalf Of Andreas Hocevar
> Sent: Thursday, 9 July 2009 8:10 PM
> To: Matthew Doyle; users at openlayers.org
> Subject: Re: [OpenLayers-Users] Visibility of features in vector layer
>
> hi,
>
> the reason why it does not work is that you are using Layer.WFS, which will load features for the visible extent after a pan/zoom. This means that your modified features get removed, and replaced by fresh ones from the server..
>
> I see that you set the visibility based on a feature attribute. In this case it would be best to set the visibility with a context in the stylemap. See the stylemap-context.html example to see what I mean.
>
> Regards,
> Andreas.
>
> On 7/9/09, Matthew Doyle <M.Doyle at bom.gov.au> wrote:
>> Hi Eric, Andreas and Paul,
>>
>> Many thanks for getting back to me, and thanks for the suggestions. I
>> have tried both ways, and the features still don't remember which
>> renderIntent or "style" they have been changed to, always reverting back to the default.
>>
>> Andreas - I did have a styleMap called "hidden" but i've now renamed
>> that to "delete" as suggested, I had assumed you could create your
>> own renderIntent names paired with Style objects, now I realise it's
>> best to stick with default, selected and delete.
>>
>> Here's my code: I hope you can perhaps see where I am going wrong?
>> First, the StyleMaps and WFS Layer instantiation:
>>
>> var pacificStyleMap = new OpenLayers.StyleMap({
>> "default": {
>> externalGraphic : "/ol/img/capital-city.png",
>> cursor: "pointer",
>> graphicWidth : 10,
>> graphicHeight : 10,
>> graphicXOffset : -6,
>> graphicYOffset : -6,
>> graphicOpacity : 1
>> },
>> "select": {
>> externalGraphic : "/ol/img/capital-city.png",
>> cursor: "pointer",
>> graphicWidth : 12,
>> graphicHeight : 12,
>> graphicXOffset : -7,
>> graphicYOffset : -7,
>> graphicOpacity : 1
>> },
>> "delete": {
>> display: "none"
>> }
>> });
>>
>> pacificWFS = new OpenLayers.Layer.WFS('Weather Stations',
>> OpenLayers.serviceURL, {typename: 'PI-STATIONS', format:
>> OpenLayers.Format.WFS}, {
>> extractAttributes: true,
>> displayOutsideMaxExtent: true,
>> styleMap: pacificStyleMap
>> });
>>
>>
>> (... and then the function which is trying to hide/show the features)
>>
>>
>> function toggleDataType(dataType) {
>> var renderIntent;
>> for(var i = 0; i< pacificWFS.features.length; i++) {
>> if(dataType == "rain") {
>> if(pacificWFS.features[i].attributes.rain != "True") {
>> renderIntent = "delete";
>> } else {
>> renderIntent = "default";
>> }
>> } else if(dataType == "tmax") {
>> if(pacificWFS.features[i].attributes.tmax != "True") {
>> renderIntent = "delete";
>> } else {
>> renderIntent = "default";
>> }
>> }
>> pacificWFS.features[i].renderIntent = renderIntent;
>> pacificWFS.drawFeature(pacificWFS.features[i]);
>> }
>> }
>>
>>
>> The toggleDataType(dataType) is called onclick from a drop-down menu,
>> all is working well with this as i have debugged the code thoroughly.
>> I have 30 features, and they have differing dataType attributes.
>>
>> I hope you guys can spot something that i'm missing here.
>>
>> I have also tried Eric's suggestion:
>> pacificWFS.features[i].style =
>> OpenLayers.Feature.Vector.style["delete"];
>> instead of setting the renderIntent at the bottom of the loop. In
>> either method, the features do hide, but as soon as i pan around or
>> zoom (causing a
>> redraw) then the features come back.
>>
>> Best regards,
>> Matt
>>
>>
>>
>>
>>
>> Eric Lemoine-2-2 wrote:
>>> On Wednesday, July 8, 2009, Paul Spencer <pagameba at gmail.com> wrote:
>>>> Eric,
>>>>
>>>> On 8-Jul-09, at 9:25 AM, Eric Lemoine wrote:
>>>>
>>>>
>>>> On Wednesday, July 8, 2009, Matthew Doyle <M.Doyle at bom.gov.au> wrote:
>>>>
>>>>
>>>> Hello all,
>>>>
>>>> Sorry for resurrecting this topic, but i am having trouble getting
>>>> my features to "remember" which StylemMap they have been changed
>>>> to, using the renderIntent.
>>>>
>>>> After following Heidtmare's suggestions below, my WFS layer is now
>>>> showing and hiding features on the fly using the renderIntent and
>>>> then calling drawFeature, as follows:
>>>>
>>>> for(var i = 0; i < WFSLayer.features.length; i++) {
>>>> WFSLayer.features[i].renderIntent = "hidden";
>>>> WFSLayer.drawFeature(WFSLayer.features[i]);
>>>> }
>>>>
>>>> This works great, right up until i zoom the map or move to a
>>>> different extent. Each feature goes back to their "default"
>>>> renderIntent and the features are shown once again.
>>>>
>>>> How can i force a permanent change for each feature so that when
>>>> the user zooms it remembers what changes have just been made?
>>>>
>>>>
>>>> Hi
>>>>
>>>> You can use the "style" property. E.g.
>>>>
>>>> feature.style = OpenLayers.Feature.Vector.style["delete"];
>>>>
>>>>
>>>>
>>>> why does the renderIntent approach not work? It does work for
>>>> controls like SelectFeature. From what I see in the code, the
>>>> renderIntent of the feature is changed in createSymbolizer called
>>>> from drawFeature, which should use the renderIntent of the feature (in this case, 'hidden').
>>>> Unless the style map doesn't contain a 'hidden' style, in which
>>>> case it would default back to ... um ... 'default' :)
>>>
>>> I agree with your reasonning Paul - setting feature.renderIntent to
>>> "delete" should work equally.
>>>
>>>
>>>> Paul
>>>>
>>>>
>>> --
>>> Eric Lemoine
>>>
>>> Camptocamp France SAS
>>> Savoie Technolac, BP 352
>>> 73377 Le Bourget du Lac, Cedex
>>>
>>> Tel : 00 33 4 79 44 44 96
>>> Mail : eric.lemoine at camptocamp.com
>>> http://www.camptocamp.com
>>> _______________________________________________
>>> Users mailing list
>>> Users at openlayers.org
>>> http://openlayers.org/mailman/listinfo/users
>>>
>>>
>> --
>> View this message in context:
>> http://n2.nabble.com/Visibility-of-features-in-vector-layer-tp2792029
>> p 3228871.html Sent from the OpenLayers Users mailing list archive at
>> Nabble.com.
>> _______________________________________________
>> Users mailing list
>> Users at openlayers.org
>> http://openlayers.org/mailman/listinfo/users
>>
>
> --
> Sent from my mobile device
>
> Andreas Hocevar
> OpenGeo - http://opengeo.org/
> Expert service straight from the developers.
--
Andreas Hocevar
OpenGeo - http://opengeo.org/
Expert service straight from the developers.
More information about the Users
mailing list