Nhận Trung tâm hình học trong OpenLayers 3


12

Đưa ra một Geometryđối tượng trong OpenLayers 3. Làm thế nào một người sẽ đi về trung tâm của nó?

Các phiên bản cũ hơn của OpenLayers đã cung cấp một getCentroidphương thức. Cũng có một getBoundscách giải quyết. Nhưng những thứ này dường như bị xóa trong OpenLayers 3.

Câu trả lời:


16

Bit của một cách giải quyết nhưng bạn có thể sử dụng getExtentphương pháp trên hình học để đặt phạm vi trên bản đồ. Tôi đoán trung tâm của khung nhìn sau đó sẽ là trung tâm của hình học;

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

Nếu bạn không muốn thay đổi chế độ xem (mà tôi có thể tưởng tượng), bạn có thể nghĩ về một hàm để tính trung tâm của phạm vi. Điều này sẽ dễ dàng trong một số loại hệ tọa độ nhất định (EPSG: 3857, dựa trên đồng hồ đo), nhưng khó hơn ở các hệ thống khác (EPSG: 4326, dựa trên các hợp âm lon / lat). Một hàm có thể tính toán trung tâm này (trong EPSG: 3857) sẽ như sau;

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

Hi vọng điêu nay co ich!


1
Tôi nghĩ rằng nó nên được var x = extent[0] + (extent[2] - extent[0]) / 2; var y = extent[1] + (extent[3] - extent[1]) / 2;
Gerrit Fölster

Vâng, bạn đã đúng, sai lầm nhỏ ở đó, đã thay đổi người nhận thức của tôi
Tim.Lucas

3
Một cái gì đó tầm thường chỉ nên được vận chuyển với OL3. +1 cho thuyết bất khả trigetCenterOfExtent
Joel

4
@Joel Này, bây giờ là vậy. Phiên bản OL 3.9.0 có ol.extent.getCentervà ổn định. Ví dụ, tôi đã làm var aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);và cho tôi trung tâm của các điểm, đường và đa giác. Kiểm tra nó ở đây
slevin

Điều đó thực sự khá tốt :)
Joel

15

Bạn có thể nhận được trung tâm mức độ của nó bằng cách sử dụng ol.extent.getCenter. Trong trường hợp của tôi, tôi có một lớp vectơ và tôi muốn lấy trung tâm của một tính năng sau khi tôi nhấp vào nó.

Vì thế

tạo một tương tác nhấp chuột đơn giản và thêm nó vào bản đồ

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

Đối với mỗi lần nhấp ...

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

Nhận tính năng đầu tiên được chọn, từ mảng "được chọn". Sau đó, có được hình học của nó, và sau đó phạm vi của nó.

Sử dụng mức độ đó để tìm trung tâm của nó, sử dụng ol.extent.getCenter

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

 });

Mã tương tự làm việc cho các dòng, điểm và đa giác.

Tái bút Các ol.extent.getCenterổn định, sử dụng trong CV Phiên bản 3.9.0 và phiên bản 3.10.1 và bạn có thể có thể tìm thấy nó ở đây


1
Đối với các dòng, điều này sẽ giúp bạn trở thành trung tâm của phạm vi chiếm bởi hình học đường. Để có được một điểm thực sự trên đường dây, bạn có thể sử dụng e.selected [0] .getGeometry (). GetClosestPoint (oo)
jOshT

1

Bạn cũng có thể có được trung tâm với:

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

Phiên bản nào của OpenLayers 3 không hoạt động? Trong 3.15.1, tôi nhận được a Uncaught TypeError: feature.getGeometry(...).getCenter is not a function.
Dirk

Các getCenter()phương pháp là chỉ áp dụng đối với hình học vòng tròn ol.geom.Circle. Có thể là bạn có một loại hình học khác nhau?
Bwyss

Đúng, tôi đã thử nó với LineString, thật tốt khi biết rằng điều này chỉ hoạt động với các vòng tròn. Tuy nhiên, đối với LineStrings, người ta có thể sử dụng mã trong câu trả lời của @ slevin sẽ trả về điểm "ở giữa dòng".
Dirk

1

OpenLayers v 6.1.1

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


Đây là trung tâm của phạm vi, không phải trung tâm của hình học như yêu cầu trong câu hỏi.
TomazicM

Tôi không nghĩ rằng điều này sẽ giúp bạn có được trọng tâm của hình học, nó sẽ giúp bạn trở thành trung tâm của phạm vi chiếm bởi hình học đường / đa giác.
Kadir ahbaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.