Ottieni Center of Geometry in OpenLayers 3


12

Dato un Geometryoggetto in OpenLayers 3. Come si farebbe per ottenere il suo centro?

Le versioni precedenti di OpenLayers hanno fornito un getCentroidmetodo. C'è stata anche una getBoundssoluzione alternativa. Ma questi sembrano essere rimossi in OpenLayers 3.

Risposte:


16

Un po 'di soluzione, ma puoi usare il getExtentmetodo sulla geometria per impostare l'estensione sulla mappa. Presumo che il centro della vista sarà quindi il centro della geometria;

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

Se non vuoi cambiare la vista (cosa che posso immaginare), puoi pensare a una funzione per calcolare il centro dell'estensione. Questo sarà facile in alcuni tipi di sistemi di coordinate (EPSG: 3857, che è basato su misuratore), ma più difficile in altri (EPSG: 4326, basato su sol / lat coords). Una funzione che potrebbe calcolare questo centro (in EPSG: 3857) sarebbe la seguente;

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

Spero che sia di aiuto!


1
Penso che dovrebbe essere var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster l'

Sì, hai ragione, un piccolo errore lì, ha cambiato il mio tendalino
Tim.Lucas,

3
Qualcosa di così banale dovrebbe essere spedito con OL3. +1 per l'agnosticogetCenterOfExtent
Gioele

4
@Joel Ehi, adesso lo è. La versione 3.9.0 di OL ha ol.extent.getCentere è stabile. Ad esempio, l'ho fatto var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);e mi ha dato il centro di punti, linee e poligoni.
Dai

In realtà è abbastanza buono :)
Joel

15

Puoi ottenere il suo centro di estensione usando ol.extent.getCenter. Nel mio caso ho un livello vettoriale e voglio ottenere il centro di una funzione dopo aver fatto clic su di essa.

Così

crea una semplice interazione con il clic e aggiungila alla mappa

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

Per ogni clic ...

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

Ottieni la prima funzione selezionata, dall'array "selezionato". Quindi ottieni la sua geometria e quindi la sua estensione.

Usa quella misura per trovare il suo 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!!!!

 });

Lo stesso codice ha funzionato per linee, punti e poligoni.

PS. Il ol.extent.getCenterè stabile, utilizzato in OL versione 3.9.0 e la versione 3.10.1 e possono si può trovare qui


1
Per le linee, questo ti porterà al centro dell'estensione occupata dalla geometria della linea. Per ottenere un punto che si trova effettivamente sulla linea, è possibile utilizzare e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT

1

Puoi anche ottenere il centro con:

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

In quale versione di OpenLayers 3 funziona? In 3.15.1, ottengo a Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk,

Il getCenter()metodo è applicabile solo alle geometrie circolari ol.geom.Circle. È possibile che tu abbia un diverso tipo di geometria?
Bwyss,

Sì, l'ho provato con un LineString, bello sapere che funziona solo con i cerchi. Per LineStrings, tuttavia, è possibile utilizzare il codice nella risposta di @ slevin che restituirà il punto "al centro della riga".
Dirk,

1

OpenLayers v 6.1.1

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


Questo è il centro di estensione, non il centro di geometria come richiesto in questione.
TomazicM,

Non penso che questo ti porterà al centroide della geometria, ti porterà al centro dell'estensione occupata dalla geometria della linea / poligono.
Kadir Şahbaz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.