Obtenir le centre de géométrie dans OpenLayers 3

12

Étant donné un Geometryobjet dans OpenLayers 3. Comment procéder pour obtenir son centre?

Les anciennes versions d'OpenLayers fournissaient une getCentroidméthode. Il y avait aussi une getBoundssolution de contournement. Mais ceux-ci semblent avoir été supprimés dans OpenLayers 3.

Joseph Ravenwolfe
la source

Réponses:

16

Un peu d'une solution de contournement, mais vous pouvez utiliser la getExtentméthode sur la géométrie pour définir l'étendue sur la carte. Je suppose que le centre de la vue sera alors le centre de la géométrie;

Test = new ol.geom.Geometry();
map.getView().fitExtent(Test.getExtent, map.getSize());
var CenterOfGeom = map.getView().getCenter()

Si vous ne voulez pas changer la vue (ce que je peux imaginer), vous pouvez penser à une fonction pour calculer le centre de l'étendue. Ce sera facile dans certains types de systèmes de coordonnées (EPSG: 3857, qui est basé sur le mètre), mais plus difficile dans d'autres (EPSG: 4326, basé sur les cordons lon / lat). Une fonction qui pourrait calculer ce centre (dans EPSG: 3857) serait la suivante;

function getCenterOfExtent(Extent){
var X = Extent[0] + (Extent[2]-Extent[0])/2;
var Y = Extent[1] + (Extent[3]-Extent[1])/2;
return [X, Y];
}

J'espère que cela t'aides!

Tim.Lucas
la source
1
Je pense que ça devrait être var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster
Oui, vous avez raison, petite erreur là-bas, a changé mon avertissement
Tim.Lucas
3
Quelque chose de si trivial devrait simplement être livré avec OL3. +1 pour l'agnostiquegetCenterOfExtent
Joel
4
@Joel Hey, c'est maintenant. OL version 3.9.0 a ol.extent.getCenteret son stable. Par exemple, je l'ai fait var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);et m'a donné le centre des points, des lignes et des polygones. Découvrez-le ici
slevin
C'est en fait assez bon :)
Joel
15

Vous pouvez obtenir son centre d'étendue à l'aide de ol.extent.getCenter. Dans mon cas, j'ai un calque vectoriel et je veux obtenir le centre d'une entité après avoir cliqué dessus.

Alors

créer une interaction de clic simple et l'ajouter à la carte

 var select = new ol.interaction.Select();
 map.addInteraction(select);

Pour chaque clic ...

select.on('select', function(e) {

Obtenez la première fonctionnalité sélectionnée, à partir du tableau "sélectionné". Obtenez ensuite sa géométrie, puis son étendue.

Utilisez cette étendue pour trouver son centre, en utilisant ol.extent.getCenter

    var aa = e.selected[0].getGeometry().getExtent();
    var oo = ol.extent.getCenter(aa);
    console.log("The center is :  "+oo); // voila!!!!

 });

Le même code a fonctionné pour les lignes, les points et les polygones.

PS. Le ol.extent.getCenterest stable, utilisé dans OL version 3.9.0 et version 3.10.1 et pouvez-vous le trouver ici

slevin
la source
1
Pour les lignes, cela vous donnera le centre de l'étendue occupée par la géométrie des lignes. Pour obtenir un point qui est réellement sur la ligne, vous pouvez utiliser e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT
1

Vous pouvez également obtenir le centre avec:

var center = e.feature.getGeometry().getCenter();
Bwyss
la source
Dans quelle version d'OpenLayers 3 cela fonctionne-t-il? En 3.15.1, j'obtiens un Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk
La getCenter()méthode n'est applicable qu'aux géométries de cercle ol.geom.Circle. Est-il possible que vous ayez un type de géométrie différent?
Bwyss
Oui, je l'ai essayé avec un LineString, bon de savoir que cela ne fonctionne qu'avec des cercles. Pour LineStrings, cependant, on peut utiliser le code dans la réponse de @ slevin qui retournera le point "au milieu de la ligne".
Dirk
1

OpenLayers v 6.1.1

var center = e.feature.getGeometry().getExtent().getCenter()

lord5et
la source
C'est le centre de l'étendue, pas le centre de la géométrie comme demandé en question.
TomazicM
Je ne pense pas que cela vous obtiendra le centroïde de la géométrie, cela vous obtiendra le centre de l'étendue occupée par la géométrie de ligne / polygone.
Kadir Şahbaz