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.

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!


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


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();

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()


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.