OpenLayers 3'te Geometri Merkezi'ni edinin


12

GeometryOpenLayers 3'te bir nesne verildi. Kişi merkezini nasıl ele geçirirdi?

OpenLayers'ın eski sürümleri bir getCentroidyöntem sağladı . Ayrıca bir getBoundsgeçici çözüm vardı. Ancak bunların OpenLayers 3'te kaldırıldığı görülmektedir.

Yanıtlar:


16

Biraz geçici bir çözüm, ancak getExtentharitadaki kapsamı ayarlamak için geometri üzerindeki yöntemi kullanabilirsiniz . Sanırım görüşün merkezi geometrinin merkezi olacak;

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

Görünümü (hayal edebileceğim) değiştirmek istemiyorsanız, kapsamın merkezini hesaplamak için bir işlev düşünebilirsiniz. Bu, belirli koordinat sistemlerinde (sayaç tabanlı EPSG: 3857) kolay, diğerlerinde daha zor olacaktır (lon / lat koordinatlarına dayanan EPSG: 4326). Bu merkezi hesaplayabilen bir fonksiyon (EPSG: 3857'de) aşağıdaki gibi olacaktır;

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

Bu yardımcı olur umarım!


1
Bence öyle olmalı var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster

Evet haklısın, küçük bir hata var, benim uçağımı değiştirdim
Tim.Lucas

3
Bu kadar önemsiz bir şey OL3 ile birlikte gönderilmelidir. Agnostik için +1getCenterOfExtent
Joel

4
@Joel Hey, şimdi öyle. OL sürüm 3.9.0 ol.extent.getCenterve kararlı. Mesela var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);bana puan, çizgi ve çokgenlerin merkezini verdim ve verdim. Buradan
slevin

Bu aslında oldukça iyi :)
Joel

15

Genişlik merkezini kullanarak elde edebilirsiniz ol.extent.getCenter. Benim durumumda bir vektör katmanım var ve tıkladıktan sonra bir özelliğin merkezini almak istiyorum.

Yani

basit bir tıklama etkileşimi oluşturun ve haritaya ekleyin

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

Her tıklama için ...

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

Seçilen ilk özelliği "seçili" diziden alın. Sonra geometrisini ve sonra kapsamını alın.

Merkezini bulmak için bu kapsamı kullanın. ol.extent.getCenter

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

 });

Aynı kod çizgiler, noktalar ve çokgenler için de işe yaradı.

PS. ol.extent.getCenterOL sürümü 3.9.0 ve sürüm 3.10.1 kullanılan, kararlı ve bunu bulabiliriz burada


1
Çizgiler için bu size çizgi geometrisinin kapladığı alanın merkezini verecektir. Aslında hatta olan bir noktaya ulaşmak için e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT

1

Ayrıca merkezi aşağıdakilerle de alabilirsiniz:

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

Bu OpenLayers 3'ün hangi sürümünde çalışıyor? 3.15.1'de a Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk

getCenter()Yöntem, daire geometrileri için geçerlidir ol.geom.Circle. Farklı bir geometri türünüz olabilir mi?
Bwyss

Evet, bunu sadece dairelerle çalıştığını bilmek güzel bir LineString ile denedim. Bununla birlikte, LineStrings için @ slevin'in cevabındaki kodu "satırın ortasındaki" noktayı döndürecek şekilde kullanabilirsiniz.
Dirk

1

OpenLayers v 6.1.1

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


Bu, söz konusu talep edildiği gibi geometri merkezi değil, kapsam merkezidir.
TomazicM

Bunun size geometrinin merkezini alacağını sanmıyorum, sizi çizgi / çokgen geometrisinin kapladığı alanın merkezine getirecek.
Kadir Şahbaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.