Получить Центр Геометрии в OpenLayers 3

12

Учитывая Geometryобъект в OpenLayers 3. Как можно получить его центр?

Более старые версии OpenLayers предоставили getCentroidметод. Был также getBoundsобходной путь. Но они, кажется, удалены в OpenLayers 3.

Джозеф Равенвольф
источник

Ответы:

16

Немного обходного пути, но вы можете использовать getExtentметод геометрии, чтобы установить экстент на карте. Я предполагаю, что центр зрения будет тогда центром геометрии;

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

Если вы не хотите менять представление (что я могу себе представить), вы можете подумать о функции для вычисления центра экстента. Это будет легко в некоторых типах систем координат (EPSG: 3857, основанная на метрах), но сложнее в других (EPSG: 4326, основанных на координатах lon / lat). Функция, которая может вычислить этот центр (в EPSG: 3857), будет выглядеть следующим образом;

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

Надеюсь это поможет!

Tim.Lucas
источник
1
Я думаю, что это должно быть var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster
Да, вы правы, маленькая ошибка там, изменил мой awnser
Tim.Lucas
3
Нечто столь тривиальное должно быть просто поставлено с OL3. +1 для агностикаgetCenterOfExtent
Джоэл
4
@ Джоэл Эй, теперь это так. Версия OL 3.9.0 имеет ol.extent.getCenterи его стабильной. Например, я сделал var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);и дал мне центр точек, линий и многоугольников. Проверьте это здесь
slevin
Это на самом деле очень хорошо :)
Джоэл
15

Вы можете получить его центр экстента, используя ol.extent.getCenter. В моем случае у меня есть векторный слой, и я хочу получить центр объекта после того, как я нажму на него.

Так

создать простое взаимодействие с кликами и добавить его на карту

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

За каждый клик ...

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

Получить первую выбранную функцию из массива «selected». Затем получите его геометрию, а затем его размер.

Используйте эту степень, чтобы найти его центр, используя ol.extent.getCenter

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

 });

Тот же код работал для линий, точек и многоугольников.

PS. ol.extent.getCenterСтабильна, используется в OL версии 3.9.0 и версии 3.10.1 и вы можете найти его здесь

Slevin
источник
1
Для линий это даст вам центр экстента, занятого геометрией линии. Чтобы получить точку, которая действительно находится на линии, вы можете использовать e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT
1

Вы также можете получить центр с:

var center = e.feature.getGeometry().getCenter();
Bwyss
источник
В какой версии OpenLayers 3 это работает? В 3.15.1 я получаю Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Дирк
getCenter()Метод применим только к окружности геометрии ol.geom.Circle. Возможно ли, что у вас другой тип геометрии?
Bwyss
Да, я попробовал это с LineString, приятно знать, что это работает только с кругами. Для LineStrings, однако, можно использовать код в ответе @ slevin, который вернет точку «в середине строки».
Дирк
1

OpenLayers v 6.1.1

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

lord5et
источник
Это центр протяженности, а не центр геометрии, как того требует вопрос.
TomazicM
Я не думаю, что это даст вам центр тяжести геометрии, это даст вам центр экстента, занятого геометрией линии / многоугольника.
Кадир Шахбаз