การเลือกกลุ่มเพื่อนบ้านที่ใกล้ที่สุดใน QGIS


14

ฉันมีรายการที่มีมากกว่า 100,000 คะแนนในรูปแบบ lat / long ซึ่งฉันได้นำเข้าสู่ qgis

ตอนนี้สิ่งที่ฉันพยายามทำที่นี่คือจัดกลุ่มจุดทั้งหมดเหล่านี้เป็นกลุ่มกล่องและโดยที่ฉันหมายถึงว่าฉันต้องการแยกแผนที่เป็นกล่องขอบ

ความต้องการของฉันมีดังนี้:

  • ไม่ควรจัดกลุ่มที่มีกล่องน้อยกว่า 100 และไม่เกิน 200 คะแนน
  • ไม่ควรมีจุดอยู่ในกลุ่มมากกว่าหนึ่งกลุ่ม
  • คะแนนทั้งหมดควรขึ้นอยู่กับเพื่อนบ้านที่ใกล้ที่สุด

ฉันจะทำสิ่งนี้ผ่าน qgis ได้อย่างไร?

ฉันสมมติว่าสามารถส่งรหัสแบบสอบถามที่กำหนดเองและบันทึกผลลัพธ์หรือกล่องที่สร้างขึ้นเป็นรูปร่างไฟล์ที่ถูกต้องหรือไม่ มีคนช่วยอธิบายวิธีการนี้ให้สำเร็จและรหัสจะเป็นอย่างไร

ตามที่กล่าวไว้วัตถุประสงค์ของฉันคือการแสดงกล่องสี่เหลี่ยมจำนวนหนึ่งเป็นเลเยอร์ shapefile โดยภายในแต่ละกล่องจะมีคุณสมบัติไม่น้อยกว่า 100 คุณสมบัติและไม่เกิน 200


6
สำหรับทุกคนที่ทำเครื่องหมายคำถามนี้ว่า "รายการโปรด": ทำไมไม่โหวตด้วย ใครจะคิดว่าคำถามที่คุณชื่นชอบควรเป็นคำถามที่ดี
underdark

1
ทำไมคุณต้องมวย? หากคุณสร้างกล่องตามจำนวนกล่องจะมีขนาดแตกต่างกันดังนั้นการเรียงกันไม่เป็นปัญหา มันอาจจะง่ายกว่าที่จะจัดกลุ่มเป็นรูปหลายเหลี่ยม (เช่นตัวเรือนูน)
diciu

@diciu ขอบคุณสำหรับการตอบสนอง ใช่ฉันคิดว่าตัวถังนูนจะไม่เป็นไรเพราะฉันสามารถเปลี่ยนมันให้เป็นกล่องหลังจากนั้น ฉันจะต้องใช้รหัสใดในการทำสิ่งนี้โดยใช้ตัวเรือนูน
NetConstructor.com

2
หากคุณใช้เปลือกนูนของกล่อง (ล้อมรอบลำตัว) จะทับซ้อนกันและความต้องการของคุณสำหรับจุดที่จะอยู่ใน BBOX เดียวไม่เป็นที่พอใจอีกต่อไป ฮัลล์นูนไม่ทำงานเป็นขั้นตอนกลางสู่ BBOX แต่แทนที่ และถึงตอนนั้นการสร้างโซลูชันทั่วไปก็จะค่อนข้างเกี่ยวข้อง
diciu

คำตอบ:


13

ฉันสามารถให้คุณเป็นส่วนหนึ่งของที่นั่นโดยสมมติว่าคุณได้คิดวิธีการขอ (a) ครึ่งตะวันออกของชุดคะแนนและ (b) ครึ่งเหนือของชุดคะแนน แน่นอนคุณสามารถรับ (c) ครึ่งทางทิศตะวันตกหรือ (d) ครึ่งทางใต้สุดได้อย่างง่ายดาย (ฉันไม่รู้ว่า QGIS แต่วิธีหนึ่งในการทำ (a) โดยทั่วไปคือการร้องขอพิกัด x แบบมัธยฐานแล้วดึงข้อมูลทุกจุดที่มีพิกัด x เกินกว่านั้นโซลูชันสำหรับ (b) - (d) มีความคล้ายคลึงกัน .)

การใช้ความสามารถนี้จะได้รับการแก้ปัญหาด้วยการเรียกซ้ำแบบง่าย ที่จะอธิบายมันสมมติว่ามีขั้นตอนHalfการดำเนินการการดำเนินงานก่อนหน้านี้ซึ่งจะใช้เวลาสองอาร์กิวเมนต์แรกคือชุดของจุดและที่สองคือรหัสที่เท่ากับtrueเมื่อแบ่งพาร์ทิชันทิศตะวันออกทิศตะวันตกเป็นที่ต้องการและเท่ากับfalseเป็นอย่างอื่น ส่งคืนชุดย่อยสองชุดของอินพุตซึ่งแบ่งพาร์ติชันตามที่ร้องขอ

Procedure Box(P: set of points, i: boolean, n: integer)
Begin
    If (Count(P) > 2*n) then
        {R,S} = Half(P,i)
        Q = Box(R,!i,n) + Box(S,!i,n)
    Else
        Q = {P}
    Endif
    Return Q
End

ใน pseudocode นี้พาร์ทิชัน R และ S Box (R,! i, n) เป็นพาร์ทิชันของ R ในทิศทาง orthogonal , Box (S,! i, n) เป็นพาร์ทิชันของ S ในทิศทาง orthogonal "+" หมายถึงการรวมตัวของทฤษฎีเซตและ {} กำหนดชุด (การสลับทิศทางการแยกจะสร้างกล่องแทนแถบ) พารามิเตอร์nระบุขนาดขั้นต่ำของกลุ่มในพาร์ติชัน ขนาดสูงสุดคือ 2 n

ตัวอย่าง

ในที่นี้เป็นภาพประกอบตั้งค่า P เป็น 12,891 จุดสุ่มแบ่งBox(P,true,100)เป็นกลุ่มขนาด 100 ถึง 200 อัลกอริทึมสร้าง 128 กล่องที่ 37 มี 100 คะแนนและ 91 มี 101 คะแนน


2
อัลกอริทึมมีประสิทธิภาพ ทำงานบนแกนเดียวมันประมวลผลสิบเท่าคะแนน (128,910) ใน 18 วินาที มันปรับขนาดเป็น O (n log (n) log (n)) สำหรับ n points (สามารถปรับปรุงให้ดีขึ้นเพื่อลบหนึ่งในปัจจัยเหล่านี้ของ log (n) แต่ความพยายามนั้นไม่น่าจะคุ้มค่า)
whuber

1
@W คุณใช้การเรียงลำดับพจนานุกรมเพื่ออำนวยความสะดวกในการแบ่งพิกัดจุด?

2
@whuber นี่ยอดเยี่ยม
dassouki

1
@Dan การเรียงคำศัพท์จะช่วยได้ แต่ไม่จำเป็น โปรดทราบว่าค่ามัธยฐานของค่า n สามารถพบได้ในเวลา O (n) (ไม่ใช่ O (n log (n))) ดังนั้นการแบ่งส่วนของจุดเข้าสู่ครึ่งตะวันออก - ตะวันตกหรือแบ่งครึ่งทิศตะวันตกเฉียงใต้เป็น asymptotically O (n) ) การคำนวณ
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.