หลีกเลี่ยงคุณสมบัติการติดฉลากหากซ้อนทับกันด้วยเลเยอร์อื่นใน QGIS?


16

ด้วย QGIS 2.12.2 ฉันจะตั้งค่าเลเบลเลเยอร์ได้อย่างไรเพื่อหลีกเลี่ยงการวางเลเยอร์ที่มีฟีเจอร์จากเลเยอร์อื่นอยู่แล้ว?

ตัวอย่างเช่นถ้าฉันมีเลเยอร์polyline ของแม่น้ำ / แม่น้ำที่มีทะเลสาบ "centerlines" และฉันวางเลเยอร์รูปหลายเหลี่ยม "ทะเลสาบ" ด้านบนตามลำดับการวาดฉันไม่ต้องการให้เลเยอร์แม่น้ำวางป้ายในทะเลสาบ . แต่ฉันอยากให้แม่น้ำติดป้ายด้านนอกของทะเลสาบ (ตามต้องการ) ด้วยวิธีนี้ฉันสามารถวางเลเบลจากเลเยอร์ทะเลสาบและฉันไม่พบการชนกันของเลเบล

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


4
ข้อมูลของคุณจัดเก็บและให้บริการอย่างไร ทำงานกับ PostGIS ฉันจะถูกล่อลวงให้กำหนดแม่น้ำของฉันด้วยมุมมองที่ส่วนต่าง ๆ ของแม่น้ำที่ตัดกับทะเลสาบถูกตัดออกทั้งหมด การติดฉลากอัตโนมัติที่ดีนั้นเป็นปัญหาที่หนักหน่วงมาก
ตัวอักษร

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

คำตอบ:


9

การติดฉลากอัตโนมัติเป็นปัญหาที่ยากมาก แต่รูปทรงของฟีเจอร์นั้นไม่ได้เลวร้ายนัก

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

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

* ฉันถือว่าการใช้ RDBMS ที่นี่เช่น PostgreSQL / PostGIS เพื่อความสะดวกและความสามารถในการอัพเดทแหล่งข้อมูลที่เชื่อถือได้ของคุณเท่านั้น แต่คุณยังสามารถทำงานล่วงหน้าด้วยไฟล์คงที่เพื่อตัดและลบฟีเจอร์ แต่ฉันไม่แนะนำสิ่งนี้หากคุณวางแผนที่จะกลับมาใช้แผนที่อีกครั้ง

ตัวอย่าง:

เริ่มต้นด้วยสองไฟล์รูปร่าง (อาจเป็นตารางฐานข้อมูล) ของแม่น้ำและทะเลสาบโดยแม่น้ำที่ตัดกับทะเลสาบและทำให้เกิดปัญหาการติดฉลากที่ยากต่อการแก้ไขอย่างสมบูรณ์และมั่นใจ:

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

นำสิ่งเหล่านี้มาไว้ใน Postgres หากคุณต้องการใช้shp2pgsql :

shp2pgsql -s 4326 /data/lake public.lakes | psql -d mydb

shp2pgsql -s 4326 /data/river public.rivers | psql -d mydb

จากนั้นกำหนดมุมมองด้วยST_Difference :

CREATE OR REPLACE VIEW rivers_clipped AS
SELECT r.id, ST_Difference(r.geom, l.geom) AS geom, r.name
FROM public.rivers AS r, public.lakes AS l;

เพิ่มมุมมองในเค้าโครงของคุณ:

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

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

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


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

13

ใน QGIS> = 2.12 คุณสามารถตั้งเลเยอร์รูปหลายเหลี่ยม "lake" เป็นอุปสรรคสำหรับป้ายกำกับ สิ่งนี้ทำได้ผ่านคุณสมบัติเลเยอร์ของเลเยอร์ "ทะเลสาบ" ใต้ส่วน 'ป้ายกำกับ' เปลี่ยนกล่องคำสั่งผสมที่ด้านบนจาก " ไม่มีป้ายกำกับ " เป็น " กีดกันป้ายกำกับอื่น ๆ จากการปิดคุณสมบัติในเลเยอร์นี้ "


1
ขอบคุณ ฉันกำลังมองหาบางอย่างเช่นนั้นและไม่เคยสังเกตเห็นตัวเลือกแบบเลื่อนลงมาก่อน อย่างไรก็ตามฉันจะบอกว่านี่เป็นเพียงความสำเร็จในระดับปานกลาง 1) มันมีเพียง "ชนิดที่เรียงลำดับ" ของป้ายที่ท้อแท้จากชั้นแม่น้ำ (พวกมันยังปรากฏอยู่ในทะเลสาบ แต่น้อยกว่านั้น) และ 2) ตอนนี้ฉันไม่มีป้ายชื่อทะเลสาบของฉัน :( ฉันได้ลองตั้งค่าริเวอร์เลเบล> อุปสรรค "กีดกันเลเบลจากการปิดคุณสมบัติ" (ไม่สำเร็จ) และการตั้งค่าน้ำหนักต่ำและสูง (ไม่สำเร็จ) และการตั้งค่าตำแหน่ง> ลำดับความสำคัญ = ต่ำและสูง (ไม่สำเร็จ)
RyanKDalton

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

1
ไม่คุณกำลังติดตามอย่างถูกต้องแน่นอน ฉันเล่นกับน้ำหนัก (น้ำหนักสูงบนรูปหลายเหลี่ยมของทะเลสาบ + "ย่อขนาดการวางป้ายชื่อเหนือการตกแต่งภายในน้ำหนักต่ำบนแม่น้ำ) และเข้าใกล้ แต่ไม่เคยไปถึงจุดที่ฉลากแม่น้ำไม่ได้อยู่ในทะเลสาบปัญหา ดูเหมือนว่าจะเกี่ยวข้องกับเส้นที่มีทั้งภายในและภายนอกของรูปหลายเหลี่ยม
RyanKDalton

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

4

ฉันพบว่าการติดฉลากโดยทั่วไปค่อนข้างยากอย่างน้อยก็เพื่อสร้างป้ายกำกับที่สร้างความพอใจให้กับผู้เขียนแผนของฉัน ในขณะที่คุณสมบัติการติดฉลากอัตโนมัติทำงานได้ดี 80% ของเวลา แต่มีบางกรณีเช่นปัญหาการติดฉลากแม่น้ำ / ทะเลสาบของคุณซึ่งไม่ได้สร้างการติดฉลากที่ดี การติดฉลากอัตโนมัติมักจะเชื่อมโยงกับรูปทรงเรขาคณิตของคุณลักษณะเช่นจำนวนชิ้นส่วนที่อยู่ในบรรทัดดังนั้นในตอนแรกทุกส่วนจะถูกติดป้าย แน่นอนว่า QGIS มีวิธีการป้องกันการติดฉลากซ้ำซึ่งขึ้นอยู่กับขนาดของมุมมองแผนที่ปัจจุบัน

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

ฉันกลัวว่าเคล็ดลับของฉันไม่ใช่สิ่งที่คุณคาดหวัง แต่ฉันหวังว่าทางเลือกของฉันจะช่วยคุณได้


คุณสร้างจุดที่ถูกต้องที่ฉันสามารถสร้างชุดข้อมูลใหม่ (ซึ่งจะง่ายต่อการทำในกรณีนี้ ... เพียงลบคุณสมบัติของเส้นใต้รูปหลายเหลี่ยม) ชุดข้อมูลที่เพิ่มขึ้นเป็นสองเท่าไม่น่าดึงดูดหรือจัดการได้เว้นแต่คุณจะใช้ วิธีการที่ใช้ฐานข้อมูลเช่น @Richard Law ถูกกล่าวถึง
RyanKDalton

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

3

มีปลั๊กอินที่เรียกว่า " หน้ากาก " ซึ่งสามารถใช้เพื่อกรองป้ายกำกับตามรูปหลายเหลี่ยม

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


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