[OpenLayers-Users] selecting marker potential bug

Chris Abraham cabraham at openplans.org
Fri Jun 12 14:50:04 EDT 2009


Great.  Makes sense.  Thanks.
Chris

On Jun 12, 2009, at 2:47 PM, Christopher Schmidt wrote:

> On Fri, Jun 12, 2009 at 02:19:37PM -0400, Chris Abraham wrote:
>> Hi,
>> I think I have found a bug.  See attached file for a simple test  
>> case.
>>
>> When you click on one of the points (features) a popup will display.
>> Since the feature is selected, it's style changes and it turns blue.
>> This is unexpected.  I would have expected it to keep the default
>> style, that is, for it not to change in appearance.  Is this the
>> desired behavior.  To prevent the appearance change, you can change
>> line 71 to:
>>                         "default": style, "select": style
>>
>> Please let me know if this is a bug or not.
>
> This is documented behavior.
>
> http://docs.openlayers.org/library/feature_styling.html
>
> The “default” intent has a special role: if the extendDefault
> property of the StyleMap is set to true (default), symbolizers
> calculated for other render intents will extend the symbolizer
> calcualated for the “default” intent. So if we want selected
> features just to have a different size or color, we only have to set a
> single property (in this example: pointRadius).
>
> Basically:
>
>  * If you want things to always look the same, pass a symbolizer
>    directly into the StyleMap, not into default.
>  * if you want to control the style when something is selected,
>    pass in a 'select' param to the hash
>  * If you are fine with the default selcetion style when applied
>    to your 'default' rules, then just pass in default.
>
> -- Chris
>
>> Also, it may be related to this bug http://trac.openlayers.org/ 
>> ticket/
>> 1498.
>>
>> Thanks,
>> Chris
>>
>>
>>
>>
>
>> <html xmlns="http://www.w3.org/1999/xhtml">
>>     <head>
>>         <title>OpenLayers Cluster Strategy Threshold</title>
>>         <link rel="stylesheet" href="../theme/default/style.css"  
>> type="text/css" />
>>         <link rel="stylesheet" href="style.css" type="text/css" />
>>         <style type="text/css">
>>             ul {
>>                 list-style: none;
>>                 padding-left: 2em;
>>             }
>>             #reset {
>>                 margin-left: 2em;
>>             }
>>         </style>
>>         <script src="http://openlayers.org/api/2.8-rc5/ 
>> OpenLayers.js"></script>
>>         <script type="text/javascript">
>>
>>             // create a semi-random grid of features to be clustered
>>             var dx = 3;
>>             var dy = 3;
>>             var px, py;
>>             var features = [];
>>             for(var x=-45; x<=45; x+=dx) {
>>                 for(var y=-22.5; y<=22.5; y+=dy) {
>>                     px = x + (2 * dx * (Math.random() - 0.5));
>>                     py = y + (2 * dy * (Math.random() - 0.5));
>>                     features.push(new OpenLayers.Feature.Vector(
>>                         new OpenLayers.Geometry.Point(px, py), {x:  
>> px, y: py}
>>                     ));
>>                 }
>>             }
>>
>>             var map, strategy, clusters;
>>             function init() {
>>                 map = new OpenLayers.Map('map');
>>                 var base = new OpenLayers.Layer.WMS("OpenLayers WMS",
>>                     ["http://t3.labs.metacarta.com/wms-c/Basic.py",
>>                      "http://t2.labs.metacarta.com/wms-c/Basic.py",
>>                      "http://t1.labs.metacarta.com/wms-c/Basic.py"],
>>                     {layers: 'satellite'}
>>                 );
>>
>>                 var style = new OpenLayers.Style({
>>                     pointRadius: "${radius}",
>>                     fillColor: "#ffcc66",
>>                     fillOpacity: 0.8,
>>                     strokeColor: "#cc6633",
>>                     strokeWidth: "${width}",
>>                     strokeOpacity: 0.8
>>                 }, {
>>                     context: {
>>                         width: function(feature) {
>>                             return (feature.cluster) ? 2 : 1;
>>                         },
>>                         radius: function(feature) {
>>                             var pix = 2;
>>                             if(feature.cluster) {
>>                                 pix = Math.min 
>> (feature.attributes.count, 7) + 2;
>>                             }
>>                             return pix;
>>                         }
>>                     }
>>                 });
>>
>>                 strategy = new OpenLayers.Strategy.Cluster();
>>
>>                 clusters = new OpenLayers.Layer.Vector("Clusters", {
>>                     strategies: [strategy],
>>                     styleMap: new OpenLayers.StyleMap({
>>                         "default": style
>>                     })
>>                 });
>>     function onSelectFeature(feature) {
>>       var popup = new OpenLayers.Popup.FramedCloud(null,  
>> feature.geometry.getBounds().getCenterLonLat(),
>>                                                    null, 'hi',
>>                                                    {size: new  
>> OpenLayers.Size(1, 1), offset: new OpenLayers.Pixel(1,-2)},
>>                                                    true, function 
>> () { selectControl.unselect(feature); });
>>       feature.popup = popup
>>       map.addPopup(popup);
>>     }
>>
>>                 var select = new OpenLayers.Control.SelectFeature(
>>                     clusters, {onSelect: onSelectFeature}
>>                 );
>>                 map.addControl(select);
>>                 select.activate();
>>                 clusters.events.on({"featureselected": display});
>>
>>                 map.addLayers([base, clusters]);
>>                 map.setCenter(new OpenLayers.LonLat(0, 0), 2);
>>
>>                 reset();
>>                 $("reset").onclick = reset;
>>
>>             }
>>
>>             function reset() {
>>                 var distance = parseInt($("distance").value);
>>                 var threshold = parseInt($("threshold").value);
>>                 strategy.distance = distance || strategy.distance;
>>                 strategy.threshold = threshold || strategy.threshold;
>>                 $("distance").value = strategy.distance;
>>                 $("threshold").value = strategy.threshold || "null";
>>                 clusters.removeFeatures(clusters.features);
>>                 clusters.addFeatures(features);
>>             }
>>
>>             function display(event) {
>>                 var f = event.feature;
>>                 var el = $("output");
>>                 if(f.cluster) {
>>                     el.innerHTML = "cluster of " +  
>> f.attributes.count;
>>                 } else {
>>                     el.innerHTML = "unclustered " + f.geometry;
>>                 }
>>             }
>>
>>
>>         </script>
>>
>>     </head>
>>     <body onload="init()">
>>         <h1 id="title">Cluster Strategy Threshold</h1>
>>         <p id="shortdesc">
>>             Demonstrates the use of the cluster strategy threshold  
>> property.
>>         </p>
>>         <div id="map" class="smallmap"></div>
>>         <div id="docs">
>>             <p>The Cluster strategy lets you display points  
>> representing clusters
>>             of features within some pixel distance.  You can  
>> control the behavior
>>             of the cluster strategy by setting its distance and  
>> threshold properties.
>>             The distance determines the search radius (in pixels)  
>> for features to
>>             cluster.  The threshold determines the minimum number  
>> of features to
>>             be considered a cluster.</p>
>>
>>         </div>
>>         <br />
>>         <p>Cluster details: <span id="output">hover over a feature  
>> to see details.</span></p>
>>         <ul>
>>             <li>
>>                 <input id="distance" name="distance" type="text"  
>> value="" size="3" />
>>                 <label for="distance">distance</label>
>>
>>             </li>
>>             <li>
>>                 <input id="threshold" name="threshold" type="text"  
>> value="" size="3" />
>>                 <label for="threshold">threshold</label>
>>             </li>
>>         </ul>
>>         <button id="reset">recluster</button>
>>     </body>
>>
>> </html>
>
>> _______________________________________________
>> Users mailing list
>> Users at openlayers.org
>> http://openlayers.org/mailman/listinfo/users
>
>
> -- 
> Christopher Schmidt
> MetaCarta




More information about the Users mailing list