Obtenha o Center of Geometry no OpenLayers 3

12

Dado um Geometryobjeto no OpenLayers 3. Como alguém poderia obter seu centro?

As versões mais antigas do OpenLayers forneciam um getCentroidmétodo. Houve também uma getBoundssolução alternativa. Mas eles parecem ter sido removidos no OpenLayers 3.

Joseph Ravenwolfe
fonte

Respostas:

16

Uma solução alternativa, mas você pode usar o getExtentmétodo na geometria para definir a extensão no mapa. Presumo que o centro da vista será o centro da geometria;

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

Se você não deseja alterar a visualização (o que eu posso imaginar), você pode pensar em uma função para calcular o centro da extensão. Isso será fácil em certos tipos de sistemas de coordenadas (EPSG: 3857, que é baseado em medidores), mas mais difícil em outros (EPSG: 4326, baseado em cordas lon / lat). Uma função que poderia calcular esse centro (no EPSG: 3857) seria a seguinte;

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 isto ajude!

Tim.Lucas
fonte
1
Eu acho que deveria ser var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster
Sim, você está certo, pequeno erro lá, mudou minha awnser
Tim.Lucas
3
Algo tão trivial deve ser enviado com o OL3. +1 para os agnósticos #getCenterOfExtent
Joel /
4
@ Joel Hey, agora é. OL versão 3.9.0 possui ol.extent.getCentere está estável. Por exemplo, eu fiz var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);e me deu o centro de pontos, linhas e polígonos. Confira aqui
slevin
Isso é realmente muito bom :)
Joel
15

Você pode obter o seu centro de extensão usando ol.extent.getCenter. No meu caso, tenho uma camada vetorial e quero obter o centro de um recurso depois de clicar nele.

então

crie uma interação simples de clique e adicione-a ao mapa

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

Para cada clique ...

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

Obtenha o primeiro recurso selecionado, na matriz "selecionada". Em seguida, obtenha sua geometria e, em seguida, sua extensão.

Use essa extensão para encontrar seu 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!!!!

 });

O mesmo código funcionou para linhas, pontos e polígonos.

PS. O ol.extent.getCenteré estável, usado no OL versão 3.9.0 e versão 3.10.1 e você pode encontrá-lo aqui

Slevin
fonte
1
Para linhas, você obterá o centro da extensão ocupada pela geometria da linha. Para chegar a um ponto que é realmente sobre a linha, você pode usar e.selected [0] .getGeometry () getClosestPoint (oo).
jOshT
1

Você também pode obter o centro com:

var center = e.feature.getGeometry().getCenter();
Bwyss
fonte
Em qual versão do OpenLayers 3 isso funciona? Na 3.15.1, recebo um Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk
O getCenter()método é aplicável apenas a geometrias de círculos ol.geom.Circle. É possível que você tenha um tipo diferente de geometria?
Bwyss
Sim, eu tentei com um LineString, bom saber que isso só funciona com círculos. Para LineStrings, no entanto, pode-se usar o código na resposta de @ slevin, que retornará o ponto "no meio da linha".
Dirk
1

OpenLayers v 6.1.1

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

lord5et
fonte
Este é o centro da extensão, não o centro da geometria, conforme solicitado em questão.
TomazicM
Eu não acho que isso lhe dará o centróide da geometria, mas sim o centro da extensão ocupada pela geometria de linha / polígono.
Kadir Şahbaz