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.

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!


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


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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.