รับ Center of Geometry ใน 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 coords) ฟังก์ชั่นที่สามารถคำนวณศูนย์นี้ (ใน 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];
}

หวังว่านี่จะช่วยได้!


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
Joel

4
@ Joel เฮ้ตอนนี้มันเป็น รุ่น OL 3.9.0 มีol.extent.getCenterและมีเสถียรภาพ ตัวอย่างเช่นฉันทำvar aa = e.selected[0].getGeometry().getExtent(); var oo = ol.extent.getCenter(aa);และให้จุดศูนย์กลางเส้นและรูปหลายเหลี่ยมกับฉัน ลองดูที่นี่สิ
58

นั่นเป็นเรื่องที่ค่อนข้างดี :)
Joel

15

ol.extent.getCenterคุณจะได้รับศูนย์ขอบเขตของการใช้ ในกรณีของฉันฉันมีเลเยอร์เวกเตอร์และฉันต้องการให้เป็นศูนย์กลางของสถานที่หลังจากที่ฉันคลิก

ดังนั้น

สร้างปฏิสัมพันธ์คลิกง่ายและเพิ่มลงในแผนที่

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

สำหรับแต่ละคลิก ...

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

รับคุณลักษณะแรกที่เลือกจากอาร์เรย์ "เลือก" จากนั้นรับเรขาคณิตของมันและจากนั้นขอบเขต

ใช้ขอบเขตนั้นเพื่อค้นหาจุดศูนย์กลางโดยใช้ ol.extent.getCenter

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

 });

รหัสเดียวกันนี้ใช้กับเส้นจุดและรูปหลายเหลี่ยม

PS The ol.extent.getCenterเสถียรใช้ใน OL เวอร์ชั่น 3.9.0 และรุ่น 3.10.1 และคุณสามารถหาได้ที่นี่


1
สำหรับเส้นตรงนี่จะทำให้คุณเป็นศูนย์กลางของขอบเขตที่ถูกยึดครองโดยเรขาคณิตเส้น ในการรับจุดที่อยู่บนบรรทัดคุณสามารถใช้ e.selected [0] .getGeometry (). getClosestPoint (oo)
jOshT

1

นอกจากนี้คุณยังสามารถใช้ศูนย์ด้วย:

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

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


นี่คือศูนย์กลางของขอบเขตไม่ใช่ศูนย์กลางของเรขาคณิตตามที่ขอในคำถาม
TomazicM

ฉันไม่คิดว่านี่จะทำให้คุณได้ศูนย์กลางของเรขาคณิต, มันจะให้คุณเป็นศูนย์กลางของขอบเขตที่ยึดครองโดยเรขาคณิตเส้น / รูปหลายเหลี่ยม
Kadir Şahbaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.