การวิเคราะห์ GIS เพื่อค้นหารูปทรงเรขาคณิตที่ซ้ำกัน


9

ฉันมีไฟล์รูปร่างขนาดใหญ่ที่มีอาคารและบ้านทั้งหมดของเมืองที่ฉันทำงานด้วย (ประมาณ 90,000 ฟีเจอร์) ข้อมูลของอาคาร / บ้านจะถูกบันทึกโดยวิศวกรสำรวจของเมืองและเนื่องจากการปฏิบัติที่ไม่ดีและการเข้าถึงผู้สำรวจที่แตกต่างกันไปยังข้อมูลนั้นอาคาร / บ้านจำนวนมากได้รับการบันทึกสองครั้งและแสดงในแผนที่เป็นรายการที่ซ้ำกัน

บางส่วนมีการทำซ้ำอย่างแน่นอน (ปรากฏเป็นรายการเดียวกัน) ขณะที่รายการอื่นจะทำสำเนาด้วยช่องว่างระหว่างวัตถุสองรายการ (เช่นวัตถุหนึ่งอยู่ภายในอีกรายการหนึ่ง - ดูภาพหน้าจอที่แนบมา)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการล้างข้อมูลนั้นเพื่อให้มีเพียงอาคาร / บ้านที่ถูกต้องในเมืองดังนั้นคำถามของฉันคือ:

มีการวิเคราะห์ GIS หรือนิพจน์ SQL ที่ฉันสามารถเรียกใช้เพื่อค้นหาคุณลักษณะที่ทำซ้ำทั้งหมด (ทั้งคุณสมบัติที่แน่นอนและคุณสมบัติที่อยู่ภายในอื่น ๆ ) ฉันมีทั้ง ArcGIS และ QGIS ดังนั้นฉันจึงเปิดรับทุกข้อเสนอแนะของคุณ


คุณสามารถลองสำรวจเครื่องมือลบแบบเหมือนกันได้ อย่างไรก็ตามต้องมีระดับสิทธิ์การใช้งานระดับองค์กร คุณสามารถตรวจสอบตัวเลือกอื่น ๆ ที่มีอยู่ในบางเทคนิคบทความ 36031 ไม่ ArcGIS ให้วิธีการระบุหรือคุณลักษณะลบที่มีรูปเรขาคณิตที่ซ้ำกัน ทางออกที่ดีที่สุดของคุณเป็นข้อมูลตรวจทานการต่อ ไม่มีเครื่องมือเหล่านี้ที่จะตอบรูปทรงเรขาคณิตแบบแยกส่วนของคุณ
MDHald

นอกจากนี้คุณจะต้องพิจารณาว่าองค์ประกอบแบบตารางจะไม่ถูกนำมาเปรียบเทียบในเครื่องมือการลบที่เหมือนกัน ฉันรู้ว่ามันไม่ใช่คำตอบ แต่หวังว่ามันจะช่วยในการแก้ปัญหา
MDHald

เป็นข้อมูลในฐานข้อมูลหรือไม่? ประเภทไหน
รัสเซลที่ ISC

ตัวเลือกหนึ่งอาจใช้ Intersect Tool (ดังที่อธิบายไว้ในคำตอบนี้ ) ใน ArcMap ซึ่งจะแสดงตำแหน่งที่ทับซ้อนกัน ซึ่งจะต้องมีการตรวจสอบและตัดสินใจด้วยตนเองว่าจะลบโพลิกอนใด ​​แต่ในกรณีที่มีการทำซ้ำที่ไม่ตรงกันฉันคิดว่าคุณต้องทำเช่นนั้น
Erica

4
การใช้คำว่า 'ซ้ำ' เป็นความเข้าใจผิดเล็กน้อยในคำถามนี้ สำหรับกรณีของสำเนาที่ถูกต้องเหมือนกันสแต็กใช่แล้วเป็นสำเนา (หรืออาจเป็น - แอตทริบิวต์อาจแตกต่างกันไป) และเนื่องจากคนอื่น ๆ แนะนำเครื่องมือ Delete หรือ Find Identical Tool อาจเป็นประโยชน์หากคุณมีระดับสิทธิ์ใช้งานนั้น แต่ถ้าพวกเขาชดเชยหรือรูปร่างที่แตกต่างพวกเขาจะไม่ซ้ำกันจริง ๆ หากคุณมีใบอนุญาตขั้นสูงฉันจะดูโทโพโลยีฐานข้อมูลภูมิศาสตร์เรียกใช้การตรวจสอบต้องไม่ทับซ้อนกัน หากไม่มีขั้นสูงบางทีสิ่งเดียวกันนี้สามารถทำได้กับ QGIS และปลั๊กอินตามคำแนะนำของ Luigi
Chris W

คำตอบ:


4

ใน QGIS ปลั๊กอิน Topology Checker สามารถแก้ไขปัญหาของคุณได้อย่างเหมาะสม


3
ฉันยอมรับโทโพโลยีน่าจะเป็นทางออกเดียวที่ดีที่สุดสำหรับปัญหาการล้างข้อมูล อย่างไรก็ตามคุณอาจต้องการขยายคำตอบของคุณเล็กน้อยโดยจัดเตรียมลิงก์ไปยังปลั๊กอินและคำอธิบายสั้น ๆ ว่าโทโพโลยีคืออะไรหรือทำอะไร ฉันเกรงว่าคำตอบของคุณที่พิมพ์ไว้จะมีคุณภาพต่ำ
Chris W

ตกลง: คำอธิบายของปลั๊กอินอยู่ที่นี่: docs.qgis.org/2.2/en/docs/user_manual/plugins/ ......และ "ต้องไม่ทับซ้อน" สามารถเข้าหาปัญหาได้ คู่มือวิดีโอของปลั๊กอินอยู่ที่นี่: youtube.com/watch?v=huhkTZkoKC8
Luigi Pirelli

6

ฉันจะใช้itertoolsของ Python และSearchCursorเพื่อหาวิธีที่มีประสิทธิภาพมากในการหาความสัมพันธ์เชิงพื้นที่ที่คุณเป็นอยู่ คุณสามารถรวมวิธีเรขาคณิต overlaps , containsและequalที่จะได้รับคุณสมบัติรูปทรงเรขาคณิต

  1. เริ่มต้นด้วยการสร้างฟังก์ชั่นเพื่อจัดระเบียบเวิร์กโฟลว์และความสามารถในการทำซ้ำได้ดียิ่งขึ้น

    def findOverlaps(x):

  2. เปิดเคอร์เซอร์ค้นหาเพื่อวนซ้ำเรขาคณิตแต่ละคุณลักษณะ

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. ใช้itertools.combinations()เพื่อส่งคืนองค์ประกอบขององค์ประกอบจากอินพุต iterablecur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. เข้าถึงคุณสมบัติเรขาคณิตด้วยวิธีการดังต่อไปนี้: equals(), และoverlaps() contains()สิ่งเหล่านี้ติดตั้งในลำดับแบบลอจิคัล - คุณสามารถปรับแต่งสิ่งนี้เพื่อให้บรรลุวัตถุประสงค์เฉพาะของคุณหากจำเป็น

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
  5. เรียกใช้ ...

enter code herefindOverlaps (FC)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

ป้อนคำอธิบายรูปภาพที่นี่

ภาพหน้าจอแสดงคุณสมบัติที่หลากหลายที่ซ้อนทับซ้อนทับ & เหมือนกันและไม่ซ้ำกัน

ป้อนคำอธิบายรูปภาพที่นี่


2

ฉันมีความคิดว่าอะไรที่อาจเป็นประโยชน์กับคุณ มันจะเป็นไปตามสมมติฐานบางอย่าง แต่มันจะช่วย จำกัด รายการคุณลักษณะที่เหมือนกันที่เป็นไปได้ให้แคบลง นี่ไม่ใช่กระบวนการอัตโนมัติ แต่จะต้องดูสำเนาด้วยตนเอง ตามความคิดเห็นดูเหมือนว่าเครื่องมืออัตโนมัติจะไม่เปรียบเทียบคุณลักษณะดังนั้นจะช่วยให้คุณไม่ลบคุณลักษณะโดยไม่ตั้งใจ

ใช้ ArcMap

(1) ทำสำเนาไฟล์ข้อมูลรูปร่างของคุณในกรณีที่มีสิ่งผิดปกติ

(2) เพิ่มคอลัมน์ใน shapefile ของคุณเป็นสองเท่า

(3) คำนวณพื้นที่สำหรับแต่ละสถานที่โดยใช้รูปแบบที่สื่อความหมายมากที่สุด (แม่นยำที่สุด) ที่คุณสามารถทำได้ สิ่งที่การปัดเศษอาจไม่ใช่ปัญหา

(4) เรียกใช้สรุป (สรุป) ในคอลัมน์นั้น ตรวจสอบให้แน่ใจว่าคุณเลือกตัวระบุที่ไม่ซ้ำกันในการสรุปและทำเครื่องหมายทั้งตัวแรกและตัวสุดท้าย

(5) ในตารางผลลัพธ์ของคุณค้นหาระเบียนเหล่านั้นที่เขตข้อมูลนับสูงกว่า 1

(6a) ตรวจสอบคุณสมบัติด้วยตนเองและทำซ้ำกระบวนการจนกว่าจะไม่มีรายการซ้ำอีก

(6b) คุณสามารถสร้างรายการรหัสที่ไม่ซ้ำกันเหล่านั้นและลบคุณสมบัติผ่าน arcpy แต่คุณมีโอกาสที่จะมีสองคุณสมบัติที่ไม่ปรากฏในพื้นที่เดียวกัน

เทคนิคการใช้ ArcPy อื่น

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

วิธีที่ฉันคิดเกี่ยวกับการทำเช่นนี้โดยใช้ ArcPy อาจต้องเสียภาษีในระบบของคุณและใช้เวลาเล็กน้อย

(1) ทำสำเนาไฟล์รูปร่างของคุณ (ในกรณีอีกครั้ง)

(2) เพิ่มคอลัมน์ใหม่เพื่อแสดงว่าซ้ำกัน สิ่งที่ใช้ 'y' หรือ 'n' หรือ 0 หรือ 1 หรืออะไรก็ตามที่ใช้งานได้

(3) สร้างรายการในไพ ธ อนเพื่อเก็บตัวระบุที่ไม่ซ้ำกัน

(4) เรียกใช้ Update Cursor ( arcpy.UpdateCursor('LAYERNAME')) สำหรับแต่ละระเบียนให้ตรวจสอบรายการของคุณเพื่อดูว่ามีตัวระบุนั้นและทำเครื่องหมายคอลัมน์ของคุณว่ามีรายการที่ซ้ำกันหรือไม่

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5) จากนั้นคุณสามารถเปรียบเทียบหรือทำสิ่งที่คุณต้องการกับคอลัมน์ที่ทำเครื่องหมายไว้

อาจมีวิธีที่ดีกว่าในการทำการเปรียบเทียบ แต่สิ่งเหล่านี้เป็นสองวิธีที่ฉันเชื่อว่าควรใช้งานได้

แก้ไข

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

ใช้ ArcMap คุณสามารถเรียกใช้เครื่องมือเรขาคณิตการ จำกัดขั้นต่ำในการจัดการข้อมูล หลังจากตรวจสอบตัวเลือกต่างๆฉันคิดว่าการใช้ตัวเลือกCONVEX_HULLน่าจะดีที่สุด

หากคุณเปรียบเทียบฟิลด์ MBG_APodX / Y1 , MBG_APod_X / Y2พร้อมกับMBG_Orientationสำหรับรายการที่ซ้ำกันคุณควรจะได้รับแนวคิดที่ดีเกี่ยวกับคุณลักษณะที่ซ้ำกัน ฉันขอแนะนำให้ใช้วิธีการสรุปที่ฉันอธิบายไว้ข้างต้นเพื่อเปรียบเทียบ เลือกหนึ่งในจุดยอด (พิกัด) จากสี่เหลี่ยมผืนผ้าที่มีขอบเขตเพื่อค้นหารายการที่ซ้ำกัน คุณอาจได้รับ 'การจับคู่' เล็กน้อยโดยบังเอิญ แต่เมื่อคุณเพิ่มในจุดยอดอื่น ๆ รวมถึงการวางแนวมันจะเป็นการเดิมพันที่ปลอดภัยพอสมควรซึ่งคุณลักษณะของผลลัพธ์นั้นซ้ำกัน

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

ฉันไม่คิดว่าจะมีวิธีอัตโนมัติในการทำเช่นนี้โดยไม่ต้องกังวลว่าจะมีการลบคุณลักษณะที่ไม่ซ้ำซ้อน วิธีการเหล่านี้ควรช่วย จำกัด จำนวนสถานที่ที่คุณจะต้องตรวจสอบด้วยตนเอง


ฉันถือว่าพวกมันเป็นรูปหลายเหลี่ยม หากเป็นเส้นคุณสามารถใช้ความยาวได้ จุดง่ายที่สุดด้วยพิกัด X / Y
Branco

2
ฉันคิดเกี่ยวกับ "คุณสมบัติของพื้นที่เท่ากัน" ด้วย แต่มันทำให้ฉันรู้สึกว่าเป็นไปได้ว่ารอยเท้าตึกอาจมีรูปร่างประเภทเดียวกันมากพอที่จะสร้างการแข่งขันที่ไม่ได้ตั้งใจ ฉันคิดว่ามันจะปรับปรุงอัตราต่อรองเพื่อปรับปรุงสิ่งต่าง ๆ ด้วยจุดตัดของ MBR ของคุณสมบัติ นั่นคือถ้าพวกเขามีพื้นที่เดียวกัน (และอาจเป็นคุณสมบัติเดียวกัน) และ MBR ของพวกเขาตัดกันบางทีอาจเป็นไปได้ว่าพวกเขามีคุณสมบัติเดียวกันสองรุ่น มันสมเหตุสมผลไหม
elrobis

2

คุณสามารถทำได้ใน SQL โดยใช้การเข้าร่วมด้วยตนเองเชิงพื้นที่ คุณไม่ได้ระบุภาษา SQL ที่คุณใช้ดังนั้นตัวอย่างนี้ใช้ Postgres / Postgis แต่สามารถปรับใช้กับ Oracle หรือ SQL Server ได้อย่างง่ายดาย สมมติว่าตารางเรียกสิ่งปลูกสร้างโดยมีรูปทรงเรขาคณิตเก็บไว้ในคอลัมน์ชื่อ geom:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

นี่จะหาจุดตัด ถ้าคุณต้องการความเท่าเทียมกันโดยรวมแล้วแทนที่ ST_Intersects ด้วย ST_Equals หรือเพียงแค่รวมสอง:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

หมายเหตุ a.id <b.id หมายถึงคุณพิจารณาเพียงครึ่งกรณีในการเข้าร่วมด้วยตนเองซึ่งทำให้ a) เร็วขึ้นและ b) ให้รายการที่คุณสามารถใช้เพื่อลบรูปหลายเหลี่ยมที่ซ้อนทับกันครึ่งหนึ่งโดยไม่ลบทั้งหมด . เห็นได้ชัดว่านี่ยังคงเป็นอัลกอริทึม O (n²) แต่ในทางปฏิบัติจะเร็วกว่ามากถ้าคุณมีดัชนีเชิงพื้นที่อยู่ - ซึ่งเป็นข้อกำหนดโดยรวมสำหรับชุดข้อมูลที่ไม่สำคัญ

คุณอาจต้องนวดตัวนี้เล็กน้อยเพื่อให้เหมาะกับคำจำกัดความของการทับซ้อนกัน - คุณไม่ต้องการลบบ้านใกล้เคียงที่ถูกสำรวจไม่ดี


หากคุณกำลังไม่มีแอตทริบิวต์ที่ไม่ซ้ำกันใน shapefile คุณสามารถใช้แทนa.rowid เป็นคำหลักใน SQLite ซึ่งจะให้ ID ภายในของชุดข้อมูล a.idrowid
LuWi

1

ปลั๊กอิน Topology Checker เป็นเครื่องมือที่ดีถ้าใช้อย่างถูกต้อง คุณยังต้องมีความเข้าใจพื้นฐานของข้อมูลของคุณและคุณต้องทำการ 'แก้ไข' ด้วยตนเอง ปลั๊กอินจะเน้นสิ่งที่คิดว่าเป็นข้อผิดพลาด มันขึ้นอยู่กับคุณที่จะตรวจสอบแต่ละอย่างและทำการตัดสินใจที่เหมาะสมสำหรับคุณและข้อมูลของคุณ ด้วย 90,000 รายการในเลเยอร์ของคุณคุณอาจอยู่บ้านในวันคริสต์มาส!

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