ได้รับคุณลักษณะการสัมผัสจุดเส้นกลับไปที่ชั้นเลเยอร์โดยใช้ QGIS?


12

ฉันใช้ QGIS 2.14.4-Essen ฉันมีสองชั้น:

  • points.shp ที่มีคะแนนพร้อมคอลัมน์ปี
  • lines.shp ที่มีบรรทัดที่เชื่อมต่อจุดจาก points.shp

ฉันต้องการรับแอตทริบิวต์ YEAR จาก points.shp กลับไปที่ lines.shp แต่ละบรรทัดเป็นส่วนเดียวที่มีหนึ่งจุดที่ปลายแต่ละด้าน (ดูภาพด้านล่าง) สิ่งที่ฉันอยากได้คือ YEAR จากจุดแรกและ YEAR จากจุดที่สองกลับเข้าไปในแต่ละบรรทัดคุณลักษณะ

ตัวอย่างเช่น: บรรทัดที่ 1 สัมผัสจุดแรกด้วย YEAR = 2010 และจุดที่สองที่มี YEAR = 2011 ฉันต้องการกลับบางอย่างเช่น '2010-2011' ลงในแอตทริบิวต์บรรทัด 1 ผลลัพธ์ควรมีลักษณะเช่นนี้:

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

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

มีวิธีในการบรรลุเป้าหมายนี้โดยใช้ QGIS หรือไม่?

คำตอบ:


9

แม้ว่าคำตอบ @radouxjuนั้นถูกต้อง แต่ฉันจะอธิบายให้ละเอียดยิ่งขึ้น

  1. คุณต้องตรวจสอบให้แน่ใจว่าคุณลักษณะรูปหลายเหลี่ยมนั้นแบ่งออกจากตำแหน่งของจุดอย่างแน่นอน
  2. Join attribute by locationใช้ เลือกคุณสมบัติการแบ่งบรรทัดที่ตำแหน่งพอยต์เป็นเลเยอร์เป้าหมาย - ในกรณีของฉันฉันชื่อมันว่า "ระเบิด"
  3. ในส่วนสรุปเลือก "รับข้อมูลสรุปของคุณสมบัติการตัดกัน" ที่นี่แทนที่จะเรียกใช้เครื่องมือสองครั้ง หนึ่งรายการสำหรับ Min และอีกครั้งสำหรับ Max คุณสามารถเรียกใช้ได้หนึ่งครั้งและเลือกทั้ง Min และ Max

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

  1. ไฟล์ out จะมีคุณสมบัติดังต่อไปนี้:

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

  1. เพิ่มฟิลด์ใหม่ของสตริงประเภทที่มีชื่อ "ปี" ไปยังรูปร่างไฟล์ใหม่จากขั้นตอนที่ 4
  2. ใช้เครื่องคิดเลขของฟิลด์และไปที่อัปเดตฟิลด์ที่มีอยู่ เลือก "ปี" และเขียนนิพจน์ต่อไปนี้:

    to_string ("MINYEAR2") + '-' + to_string ("MAXYEAR2")

  3. แอตทริบิวต์เอาต์พุตสุดท้ายจะมีลักษณะดังนี้:

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

  1. ผลลัพธ์สุดท้ายจะเป็นดังนี้:

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


นี่คือผลลัพธ์หลังจากการทดสอบข้อมูลของคุณ:

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

ตารางทางด้านซ้ายคือข้อมูลจุดหลังจากสร้างเขตข้อมูลใหม่ของจำนวนเต็มชนิดและตารางทางด้านขวาคือหลังจากเข้าร่วมบรรทัดกับข้อมูลจุดโดยใช้ขั้นตอนที่ 2 ที่กล่าวถึงข้างต้น จากนั้นฉันใช้ขั้นตอนที่ 5-6 เพื่อสร้างข้อมูลขั้นสุดท้าย

ปรับปรุง

ฉันพยายามแปลงฟิลด์ YEAR จากสตริงเป็นจำนวนเต็มโดยใช้ expression to_int () และใช้งานได้ ดังนั้นคุณไม่จำเป็นต้องทำด้วยตนเอง อย่างไรก็ตามประเภทข้อมูลควรเป็นชนิดไม่Integer Integer64ตรวจสอบให้แน่ใจว่าระยะเวลาในสนามจะขึ้นอยู่กับ 9. ถ้าคุณเลือกความยาวด้านของ 10 ก็จะถูกแปลงและมันจะไม่ทำงานกับInterger64 Interger64จากนั้นคุณสามารถทำตามขั้นตอน 2-6

นี่คือผลลัพธ์สุดท้ายหลังจากใช้นิพจน์ to_int ():

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

ในตารางแอตทริบิวต์ด้านบนทางซ้ายปีเป็นสตริงชนิดและปี 2 เป็นจำนวนเต็มชนิดที่แปลงโดยใช้นิพจน์ to_int () คุณสามารถเห็นในตารางคุณลักษณะทางด้านขวาหลังจากทำตามขั้นตอนที่ 2-6 ฉันได้รับ MINYEAR2 และ MAXYEAR2 แล้วแปลงเป็นสตริงกลับมาอีกครั้งเพื่อเชื่อมทุกอย่างเข้าด้วยกันในฟิลด์ YEAR


ขอบคุณมาก! นั่นคือสิ่งที่ฉันทำหลายครั้ง ฉันเดาว่าคุณสมบัติของรูปหลายเหลี่ยมจะแยกกันอยู่เหนือตำแหน่งของจุดต่าง ๆ เพราะฉันสร้างเส้นจากเลเยอร์จุดโดยใช้ปลั๊กอิน Points2One คุณลองกับชุดข้อมูลนี้ได้ไหม: drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view ? ขอบคุณอีกครั้ง!
wiltomap

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

ฉันพยายามแปลงฟิลด์ YEAR จากสตริงเป็นจำนวนเต็มโดยใช้ expression to_int () แต่ก็ใช้งานไม่ได้ เมื่อฉันป้อนปีด้วยตนเองมันทำงานตามที่คาดไว้
ahmadhanb

คำอธิบายที่ชัดเจน @ahmadhanb
Shiko

ขอบคุณ @ahmadhanb! ความจริงก็คือข้อมูลที่ฉันแบ่งปันข้างต้นเป็นส่วนย่อย ฉันมีหลายพันเส้นและคะแนนดังนั้นการป้อนปีด้วยตนเองจะค่อนข้างทำงานมาก! นี่เป็นข้อบกพร่องหรือไม่?
wiltomap

5

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

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

เครื่องคิดเลขในสนาม:

tostring(minYEAR) + '-' + tostring(maxYEAR)

เมธอดนี้ส่งคืนคอลัมน์เพิ่มเติมที่ชื่อCOUNTและมีค่า2สำหรับแต่ละบรรทัด ตัวเลือก Min และ Max จะส่งคืนข้อมูลเหล่านี้ ฉันได้เลือกเลเยอร์ของเส้นเป็นเลเยอร์เป้าหมายและเลเยอร์ของจุดเป็นเลเยอร์รวมแล้ว
wiltomap

ฟิลด์ตัวเลขหรือข้อความปีของคุณคืออะไร
radouxju

YEARฟิลด์เป็นจำนวนเต็ม ฉันพยายามสร้างคอลัมน์ใหม่ด้วยto_string("YEAR")แต่ผลลัพธ์จะเหมือนกันทุก
ประการ

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

4

สมมติว่าโทโพโลยีนั้นสมบูรณ์แบบสร้างฟิลด์ 'WKT' ด้วยนิพจน์

geom_to_wkt( $geometry) 

ในเลเยอร์จุดของคุณคุณสามารถใช้การแสดงออก:

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

ในเครื่องคิดเลขฟิลด์ของเลเยอร์เลเยอร์สร้างสตริงข้อความ

  • attribute (คุณสมบัติ, attribute_name) ส่งคืนค่าของคุณสมบัติที่ระบุจากสถานที่ที่นี่ปีของคุณลักษณะจุดที่
    ได้รับ
  • get_feature (layer, attribute, value) ส่งกลับคุณสมบัติแรกของ layer ที่ตรงกับค่า attribute ที่กำหนด ที่นี่เราตรวจสอบว่าเราสามารถหาจุดที่มีพิกัดเดียวกัน (ในรูปแบบ WKT) เป็น
    จุดเริ่มต้นและจุดสิ้นสุดของเส้นของคุณหรือไม่
  • start_point (เรขาคณิต) ส่งคืนโหนดแรกจากเรขาคณิต นี่คือจุดสุดยอดแรกของสายของคุณ
  • end_point (เรขาคณิต) ส่งคืนโหนดสุดท้ายจากเรขาคณิต นี่คือจุดสุดยอดสุดท้ายของบรรทัดของคุณ
  • geom_to_wkt (เรขาคณิต) ส่งกลับการแทนข้อความที่รู้จักกันดี (WKT) ของรูปทรงเรขาคณิต ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถอัปเดตเป็น:

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

เพื่อแสดงเพียงหนึ่งปีหากมีการเชื่อมต่อสองจุดในปีเดียวกัน (รับ 200X แทน 200X-200X)

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

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