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.

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!


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


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();

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()


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.