Obtenga el Centro de Geometría en OpenLayers 3

12

Dado un Geometryobjeto en OpenLayers 3. ¿Cómo se conseguiría obtener su centro?

Las versiones anteriores de OpenLayers proporcionaban un getCentroidmétodo. También hubo una getBoundssolución alternativa. Pero estos parecen ser eliminados en OpenLayers 3.

Joseph Ravenwolfe
fuente

Respuestas:

16

Es una solución alternativa, pero puede usar el getExtentmétodo en la geometría para establecer la extensión en el mapa. Supongo que el centro de la vista será el centro de la geometría;

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

Si no desea cambiar la vista (que puedo imaginar), puede pensar en una función para calcular el centro de la extensión. Esto será fácil en ciertos tipos de sistemas de coordenadas (EPSG: 3857, que está basado en medidores), pero más difícil en otros (EPSG: 4326, basado en cables lon / lat). Una función que podría calcular este centro (en EPSG: 3857) sería la siguiente;

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

¡Espero que esto ayude!

Tim.Lucas
fuente
1
Creo que debería ser var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster
Sí, tienes razón, un pequeño error allí, cambió mi bocina
Tim.Lucas
3
Algo tan trivial debería enviarse con OL3. +1 para el agnósticogetCenterOfExtent
Joel
44
@ Joel Hola, ahora lo es. OL versión 3.9.0 tiene ol.extent.getCentery es estable. Por ejemplo, lo hice var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);y me dio el centro de puntos, líneas y polígonos. Échale un vistazo aquí
slevin
Eso es realmente bastante bueno :)
Joel
15

Puede obtener su extensión centro utilizando ol.extent.getCenter. En mi caso, tengo una capa vectorial y quiero obtener el centro de una entidad después de hacer clic en ella.

Entonces

crear una interacción de clic simple y agregarla al mapa

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

Por cada clic ...

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

Obtenga la primera característica seleccionada, de la matriz "seleccionada". Luego obtenga su geometría, y luego su extensión.

Use esa extensión para encontrar su centro, usando ol.extent.getCenter

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

 });

El mismo código funcionó para líneas, puntos y polígonos.

PD. El ol.extent.getCenteres estable, se usa en la versión OL 3.9.0 y la versión 3.10.1 y puede encontrarlo aquí

slevin
fuente
1
Para las líneas, esto le dará el centro de la extensión ocupada por la geometría de la línea. Para obtener un punto que está realmente en la línea, puede usar e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT
1

También puede obtener el centro con:

var center = e.feature.getGeometry().getCenter();
Bwyss
fuente
¿En qué versión de OpenLayers 3 funciona esto? En 3.15.1, obtengo a Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk
El getCenter()método solo es aplicable a las geometrías circulares ol.geom.Circle. ¿Es posible que tenga un tipo diferente de geometría?
Bwyss
Sí, lo probé con un LineString, es bueno saber que esto solo funciona con círculos. Para LineStrings, sin embargo, uno puede usar el código en la respuesta de @ slevin que devolverá el punto "en el medio de la línea".
Dirk
1

OpenLayers v 6.1.1

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

lord5et
fuente
Este es el centro de extensión, no el centro de geometría como se solicita en cuestión.
TomazicM
No creo que esto le dé el centroide de la geometría, le dará el centro de la extensión ocupada por la geometría de línea / polígono.
Kadir Şahbaz