Holen Sie sich das Geometriezentrum in OpenLayers 3

12

Gegeben ein GeometryObjekt in OpenLayers 3. Wie würde man vorgehen, um sein Zentrum zu bekommen?

Ältere Versionen von OpenLayers stellten eine getCentroidMethode bereit . Es gab auch eine getBoundsProblemumgehung. Diese scheinen jedoch in OpenLayers 3 entfernt zu sein.

Joseph Ravenwolfe
quelle

Antworten:

16

Eine kleine Problemumgehung, aber Sie können die getExtentMethode für die Geometrie verwenden, um die Ausdehnung auf der Karte festzulegen. Ich gehe davon aus, dass der Mittelpunkt der Ansicht dann der Mittelpunkt der Geometrie ist.

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

Wenn Sie die Ansicht nicht ändern möchten (was ich mir vorstellen kann), können Sie sich eine Funktion zur Berechnung des Ausdehnungszentrums vorstellen. Dies ist in bestimmten Arten von Koordinatensystemen einfach (EPSG: 3857, das meterbasiert ist), in anderen jedoch schwieriger (EPSG: 4326, basierend auf Lon / Lat-Koordinaten). Eine Funktion, die dieses Zentrum berechnen könnte (in EPSG: 3857), wäre wie folgt;

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

Hoffe das hilft!

Tim.Lucas
quelle
1
Ich denke es sollte sein var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster
Ja, Sie haben Recht, kleiner Fehler dort, hat meine Markise geändert
Tim.Lucas
3
Etwas so Triviales sollte nur mit OL3 geliefert werden. +1 für den AgnostikergetCenterOfExtent
Joel
4
@ Joel Hey, jetzt ist es. OL Version 3.9.0 hat ol.extent.getCenterund ist stabil. Zum Beispiel var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);habe ich das Zentrum von Punkten, Linien und Polygonen gegeben. Überprüfen Sie es hier
Slevin
Das ist eigentlich ganz gut :)
Joel
15

Sie können sein Ausdehnungszentrum mit erhalten ol.extent.getCenter. In meinem Fall habe ich eine Vektorebene und möchte die Mitte eines Features erhalten, nachdem ich darauf geklickt habe.

Damit

Erstellen Sie eine einfache Klickinteraktion und fügen Sie sie der Karte hinzu

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

Für jeden Klick ...

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

Holen Sie sich das erste ausgewählte Feature aus dem "ausgewählten" Array. Dann erhalten Sie seine Geometrie und dann seine Ausdehnung.

Verwenden Sie dieses Ausmaß, um das Zentrum zu finden ol.extent.getCenter

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

 });

Der gleiche Code funktionierte für Linien, Punkte und Polygone.

PS. Das ol.extent.getCenterist stabil, wird in OL Version 3.9.0 und Version 3.10.1 verwendet und ist hier zu finden

Slevin
quelle
1
Bei Linien erhalten Sie den Mittelpunkt der Ausdehnung, die von der Liniengeometrie belegt wird. Um einen Punkt zu erhalten, der tatsächlich auf der Linie liegt, können Sie e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT
1

Sie können das Zentrum auch erhalten mit:

var center = e.feature.getGeometry().getCenter();
Bwyss
quelle
In welcher Version von OpenLayers 3 funktioniert das? In 3.15.1 bekomme ich eine Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk
Die getCenter()Methode ist nur auf Kreisgeometrien anwendbar ol.geom.Circle. Ist es möglich, dass Sie eine andere Art von Geometrie haben?
Bwyss
Ja, ich habe es mit einem LineString versucht, gut zu wissen, dass dies nur mit Kreisen funktioniert. Für LineStrings kann man jedoch den Code in der Antwort von @ slevin verwenden, der den Punkt "in der Mitte der Zeile" zurückgibt.
Dirk
1

OpenLayers v 6.1.1

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

lord5et
quelle
Dies ist der Schwerpunkt, nicht der Mittelpunkt der Geometrie, wie in Frage gestellt.
TomazicM
Ich glaube nicht, dass Sie dadurch den Schwerpunkt der Geometrie erhalten, sondern den Mittelpunkt der von der Linien- / Polygongeometrie belegten Ausdehnung.
Kadir Şahbaz