<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Emmanuel Dewaele &#187; regroupement</title>
	<atom:link href="https://edewaele.toile-libre.org/?feed=rss2&#038;tag=regroupement" rel="self" type="application/rss+xml" />
	<link>https://edewaele.toile-libre.org</link>
	<description></description>
	<lastBuildDate>Thu, 27 Nov 2014 17:25:49 +0000</lastBuildDate>
	<language>fr-FR</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>La magie du regroupement dans OpenLayers</title>
		<link>https://edewaele.toile-libre.org/?p=113</link>
		<comments>https://edewaele.toile-libre.org/?p=113#comments</comments>
		<pubDate>Mon, 16 Jul 2012 19:18:59 +0000</pubDate>
		<dc:creator><![CDATA[emmanuel]]></dc:creator>
				<category><![CDATA[SIG]]></category>
		<category><![CDATA[Technique]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[OpenLayers]]></category>
		<category><![CDATA[regroupement]]></category>

		<guid isPermaLink="false">http://edewaele.toile-libre.org/?p=113</guid>
		<description><![CDATA[Quand on affiche tout un tas de points d&#8217;intérêts sur une carte, leur répartition n&#8217;est pas toujours uniforme, ce qui occasionne parfois un agglutinement des points d&#8217;intérêt qui s&#8217;empilent dans une mêlée confuse. Pour gérer proprement des points d&#8217;intérêt nombreux et qui ont tendance à se confondre, on dispose dans OpenLayers d&#8217;un mécanisme de regroupement, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quand on affiche tout un tas de points d&rsquo;intérêts sur une carte, leur répartition n&rsquo;est pas toujours uniforme, ce qui occasionne parfois un agglutinement des points d&rsquo;intérêt qui s&rsquo;empilent dans une mêlée confuse.</p>
<p>Pour gérer proprement des points d&rsquo;intérêt nombreux et qui ont tendance à se confondre, on dispose dans OpenLayers d&rsquo;un mécanisme de regroupement, qu&rsquo;on désigne en anglais sous le nom de <em>clustering</em>. Plutôt que dessiner tous les points tel quel, la bibliothèque va se charger de regrouper les points très rapprochés en un seul point d&rsquo;intérêt. Ce système, bien que puissant est un peu compliqué, comme bien d&rsquo;autres choses dans OpenLayers.</p>
<p>Voyons point par point comment mettre en œuvre le regroupement sur une couche de points, gérer l&rsquo;apparence des points regroupés et prendre en compte les événements sur une telle couche.</p>
<p><strong>Propriétés de la couche</strong></p>
<p>Le regroupement dans OpenLayers est implémenté comme une stratégie, c&rsquo;est à dire un objet qui change de comportement d&rsquo;une couche. Voici la définition de notre couche de point d&rsquo;intérêt, un objet OpenLayers.Strategy.Cluster() est fourni dans la propriété <em>strategies</em>.</p>
<pre>var layerPOI = new OpenLayers.Layer.Vector("Points d'intérêt", {
	projection: new OpenLayers.Projection("EPSG:4326"),
	strategies: [
		new OpenLayers.Strategy.Cluster()
	],
	styleMap:new OpenLayers.StyleMap({
           "default": clusterStyle
	})
});</pre>
<p>Nota: Nous avons référencé un style nommé <em>clusterStyle</em>, que nous expliciterons plus tard.</p>
<p><strong>Manipuler les groupes</strong></p>
<p>Il est nécessaire ici d&rsquo;adapter votre code concernant la gestion des événements liés à la couche. Quand on implémente un contrôle, comme SelectFeature pour intercepter le clic sur un objet, sans regroupement d&rsquo;objets, on reçoit un objet OpenLayers.Vector, dont les propriétés sont:</p>
<ul>
<li>attributes:  tableau des attributs de l&rsquo;objets</li>
<li>geometry: une géométrie</li>
</ul>
<p>Quand on ajoute à cela le regroupement, on reçoit plus des OpenLayers.Vector, mais un objet avec deux attributs:</p>
<ul>
<li>count: nombre de points d&rsquo;intérêt dans le groupe</li>
<li>cluster: tableau des objets du groupe, ce sont des OpenLayers.Vector</li>
</ul>
<p><strong>Re-définir le style</strong></p>
<p>Pour la couche, on doit définir un style avec la classe OpenLayers.Style. Comme dans toutes les déclarations de style dans OpenLayers, on y définit les valeurs de différents attributs comme le label, la grosseur d&rsquo;un point ou l&rsquo;adresse d&rsquo;un pictogramme. Mais comme on ne souhaite pas forcément rendre un point d&rsquo;intérêt seul de la même manière que le regroupement de dix points d&rsquo;intérêt, on peut calculer des propriétés de style en fonction du groupe de points d&rsquo;intérêt. Là où on donne souvent des valeurs constantes pour une propriété, on peut déclarer dans les attributs des &laquo;&nbsp;variables&nbsp;&raquo;. Par exemple, dans la propriété label, on utilise la déclaration ${nombre}, qui désigne une valeur à calculer lors du rendu de la couche. Les variables sont calculées dans des méthodes du même nom, qui font partie de l&rsquo;objet <em>context</em>.</p>
<p>Dans cet exemple, on affiche comme label le nombre d&rsquo;éléments d&rsquo;un groupe d&rsquo;au moins deux éléments, avec la variable ${nombre}.</p>
<pre>var clusterStyle = new OpenLayers.Style({
    label:"${nombre}",
    graphicWidth: 20,
    graphicHeight: 20
}, {
    context: {
         nombre: function(feature) {
             if(feature.attributes.count&gt;=2)
            	 return feature.attributes.count;
             else
            	 return "";
         }
    }
});</pre>
<p><strong>Critères de regroupement</strong></p>
<p>L&rsquo;algorithme de regroupement d&rsquo;OpenLayers est relativement simple: on regroupe tous les objets qui, à l&rsquo;écran, sont à moins de 40 pixels de distance.</p>
<p>On peut vouloir personnaliser ce comportement, pour prendre en compte d&rsquo;autres règles de gestion. Dans ce cas, après avoir instancié la stratégie de regroupement, on doit re-définir sa méthode <em>shouldCluster</em>. Partant d&rsquo;un groupe existant, nommé <em>cluster</em> et d&rsquo;un objet <em>feature</em> qu&rsquo;on pourrait y ajouter, cette méthode décide de la possibilité de fusionner le groupe avec un élément, en retournant un booléen. Dans cet exemple, on a modifié la stratégie pour ne regrouper que les objets qui ont la même valeur pour l&rsquo;attribut <em>type</em> et qui sont distant d&rsquo;au plus 35 pixels.</p>
<pre>var clusterCat = new OpenLayers.Strategy.Cluster();
clusterCat.shouldCluster = function(cluster,feature)
{
	if(cluster.cluster[0].attributes.type != feature.attributes.type)
	{
		return false;
	}
	var cc = cluster.geometry.getBounds().getCenterLonLat();
        var fc = feature.geometry.getBounds().getCenterLonLat();
        var distance = (Math.sqrt(Math.pow((cc.lon - fc.lon), 2) + Math.pow((cc.lat - fc.lat), 2)) / this.resolution);
        return (distance &lt;= 35);
}</pre>
]]></content:encoded>
			<wfw:commentRss>https://edewaele.toile-libre.org/?feed=rss2&#038;p=113</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
