Uzyskaj środek geometrii w OpenLayers 3

12

Biorąc pod uwagę Geometryobiekt w OpenLayers 3. W jaki sposób można uzyskać jego centrum?

Starsze wersje OpenLayers zawierały getCentroidmetodę. Było też getBoundsobejście. Ale wydaje się, że zostały one usunięte w OpenLayers 3.

Joseph Ravenwolfe
źródło

Odpowiedzi:

16

Trochę obejścia, ale możesz użyć getExtentmetody na geometrii, aby ustawić zasięg na mapie. Zakładam, że środek widoku będzie wtedy środkiem geometrii;

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

Jeśli nie chcesz zmieniać widoku (co mogę sobie wyobrazić), możesz pomyśleć o funkcji obliczającej środek zasięgu. Będzie to łatwe w niektórych typach układów współrzędnych (EPSG: 3857, który jest oparty na metrach), ale trudniejsze w innych (EPSG: 4326, w oparciu o współrzędne lon / lat). Funkcja, która mogłaby obliczyć to centrum (w EPSG: 3857) byłaby następująca;

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

Mam nadzieję że to pomoże!

Tim.Lucas
źródło
1
Myślę, że tak powinno być var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster,
Tak, masz rację, mała pomyłka, zmieniłem mój awnser
Tim.Lucas
3
Coś tak trywialnego powinno zostać wysłane z OL3. +1 dla agnostykagetCenterOfExtent
Joel
4
@Joel Hej, teraz jest. Wersja OL 3.9.0 ma ol.extent.getCenteri jest stabilna. Na przykład zrobiłem var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);i podałem środek punktów, linii i wielokątów. Sprawdź to tutaj
śledź
To jest całkiem niezłe :)
Joel
15

Możesz uzyskać jego środek zakresu za pomocą ol.extent.getCenter. W moim przypadku mam warstwę wektorową i chcę uzyskać środek funkcji po kliknięciu.

Więc

utwórz proste kliknięcie i dodaj je do mapy

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

Dla każdego kliknięcia ...

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

Uzyskaj pierwszą wybraną funkcję z „wybranej” tablicy. Następnie uzyskaj jego geometrię, a następnie zasięg.

Użyj tego zasięgu, aby znaleźć jego centrum, używając ol.extent.getCenter

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

 });

Ten sam kod działał dla linii, punktów i wielokątów.

PS. ol.extent.getCenterJest stabilny, stosowany w OL wersji 3.9.0 i wersji 3.10.1 i może znajdziesz ją tutaj

Slevin
źródło
1
W przypadku linii uzyskasz środek zakresu zajmowanego przez geometrię linii. Aby uzyskać punkt, który faktycznie znajduje się na linii, możesz użyć e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT
1

Możesz także uzyskać centrum dzięki:

var center = e.feature.getGeometry().getCenter();
Bwyss
źródło
W jakiej wersji OpenLayers 3 to działa? W 3.15.1 dostaję Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk
getCenter()Metoda ma zastosowanie tylko do geometrii koła ol.geom.Circle. Czy to możliwe, że masz inny typ geometrii?
Bwyss
Tak, próbowałem z LineString, dobrze wiedzieć, że działa to tylko z okręgami. W przypadku LineStrings można jednak użyć kodu w odpowiedzi @ slevin, który zwróci punkt „w środku linii”.
Dirk
1

OpenLayers v 6.1.1

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

lord5et
źródło
Jest to środek zakresu, a nie środek geometrii, jak podano w pytaniu.
TomazicM
Nie sądzę, aby to zapewniło ci środek ciężkości geometrii, pozwoli ci uzyskać środek zakresu zajmowanego przez geometrię linii / wielokąta.
Kadir Şahbaz