Dapatkan Center of Geometry di OpenLayers 3

12

Diberikan Geometryobjek di OpenLayers 3. Bagaimana cara mendapatkan pusatnya?

Versi OpenLayers yang lebih lama menyediakan getCentroidmetode. Ada juga getBoundssolusi. Tetapi ini tampaknya dihapus di OpenLayers 3.

Joseph Ravenwolfe
sumber

Jawaban:

16

Sedikit solusi tetapi Anda dapat menggunakan getExtentmetode pada geometri untuk mengatur batas pada peta. Saya menganggap pusat tampilan kemudian akan menjadi pusat geometri;

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

Jika Anda tidak ingin mengubah tampilan (yang dapat saya bayangkan), Anda dapat memikirkan fungsi untuk menghitung pusat sejauh mana. Ini akan mudah dalam beberapa jenis sistem koordinat (EPSG: 3857, yang berbasis meter), tetapi lebih sulit pada sistem lainnya (EPSG: 4326, berdasarkan lon / lat coords). Fungsi yang dapat menghitung pusat ini (dalam EPSG: 3857) adalah sebagai berikut;

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

Semoga ini membantu!

Tim.Lucas
sumber
1
Saya pikir itu harus var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster
Ya Anda benar, kesalahan kecil di sana, mengubah awnser saya
Tim.Lucas
3
Sesuatu yang begitu sepele harus dikirim dengan OL3. +1 untuk agnostikgetCenterOfExtent
Joel
4
@ Joel Hei, sekarang. OL versi 3.9.0 telah ol.extent.getCenterdan stabil. Sebagai contoh, saya lakukan var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);dan memberi saya titik, garis, dan poligon. Lihat di sini
slevin
Itu sebenarnya cukup bagus :)
Joel
15

Anda dapat menggunakan pusat jangkauannya ol.extent.getCenter. Dalam kasus saya, saya memiliki layer vektor dan saya ingin mendapatkan pusat fitur setelah saya mengkliknya.

Begitu

buat interaksi klik sederhana dan tambahkan ke peta

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

Untuk setiap klik ...

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

Dapatkan fitur pertama yang dipilih, dari array "terpilih". Kemudian dapatkan geometri, dan kemudian luasnya.

Gunakan sejauh itu untuk menemukan pusatnya, gunakan ol.extent.getCenter

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

 });

Kode yang sama berfungsi untuk garis, titik, dan poligon.

PS. The ol.extent.getCenterstabil, yang digunakan dalam OL versi 3.9.0 dan versi 3.10.1 dan dapat Anda dapat menemukannya di sini

slevin
sumber
1
Untuk garis, ini akan membuat Anda menjadi pusat sejauh yang ditempati oleh garis geometri. Untuk mendapatkan poin yang sebenarnya ada di telepon, Anda dapat menggunakan e.seleksi [0] .getGeometry (). GetClosestPoint (oo)
jOshT
1

Anda juga bisa mendapatkan pusat dengan:

var center = e.feature.getGeometry().getCenter();
Bwyss
sumber
Di versi OpenLayers 3 manakah ini berfungsi? Di 3.15.1, saya mendapatkan Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk
The getCenter()Metode ini hanya berlaku untuk geometri lingkaran ol.geom.Circle. Apakah mungkin Anda memiliki jenis geometri yang berbeda?
Bwyss
Yap, saya mencobanya dengan LineString, senang mengetahui bahwa ini hanya berfungsi dengan lingkaran. Untuk LineStrings, bagaimanapun, seseorang dapat menggunakan kode dalam jawaban @ slevin yang akan mengembalikan titik "di tengah-tengah baris".
Dirk
1

OpenLayers v 6.1.1

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

lord5et
sumber
Ini adalah pusat tingkat, bukan pusat geometri seperti yang diminta.
TomazicM
Saya tidak berpikir ini akan membuat Anda pusat massa geometri, itu akan membuat Anda pusat sejauh ditempati oleh garis / poligon geometri.
Kadir Şahbaz