क्या एक ऊंचाई लेबल के नीचे एक समोच्च रेखा को बाधित करने का एक तरीका है?
क्या एक ऊंचाई लेबल के नीचे एक समोच्च रेखा को बाधित करने का एक तरीका है?
जवाबों:
हाँ, उल्लेखनीय है। आम तौर पर मैं आंशिक रूप से पारदर्शी बफर का सुझाव देता हूं, लेकिन मैं देखता हूं कि आप यह क्यों करना चाहते हैं।
यह धीमा हो सकता है, और आपको मैन्युअल रूप से यह तय करने की आवश्यकता है कि आप लेबल कहाँ जाना चाहते हैं - लेकिन कार्टोग्राफिक रूप से, यह कोई बुरी बात नहीं है!
यहां देखें एक स्क्रीनशॉट ...
जैसा कि आप देख सकते हैं, कोई बफ़र्स नहीं। नीचे का रास्ता अप्रभावित है। मैंने पतले मध्यवर्ती समोच्च लाइनों को शामिल किया है, और उन्हें स्टाइल किया है ताकि वे केवल दिखाए जा सकें जब ELEV% 50 <> 0
मैंने इसे QGIS 2.12 में किया है ... आपका माइलेज पहले के संस्करणों के साथ भिन्न हो सकता है।
मैं यहाँ मानता हूँ कि आपके पास प्रत्येक समोच्च रेखा पर "ELEV" फ़ील्ड है।
समोच्च रेखाओं को विभाजित करें
समान लंबाई वाले खंडों में अपने आकृति को विभाजित करने के लिए प्रोसेसिंग और GRASS एल्गोरिथम v.split.length का उपयोग करें । आपको एक लंबाई चुनने की ज़रूरत है जो मानचित्र इकाइयों में आपके लेबल के आकार के करीब होगी, यह मानते हुए कि आप मीटर का उपयोग कर रहे हैं। यहां मैंने 200 मी।
इससे सावधान रहें क्योंकि यह आपकी फ़ाइल को बहुत बड़ा बना देगा (स्क्रीनशॉट में फीचर की गणना करता है)।
इसके आस-पास जाने के लिए, आप सभी मध्यवर्ती रेखाओं को संसाधित करने से बचने के लिए केवल उन आकृति लाइनों को उत्पन्न करना चाहते हैं जिन्हें आप शैली (जैसे हर 50 या 100 मीटर) चाहते हैं।
इस लेयर में, showLabel नामक 1 अंकीय पूर्णांक फ़ील्ड जोड़ें । डिफ़ॉल्ट 0 या NULL के लिए।
लेबल को केवल उस खंड पर दिखाने के लिए बदलें जहाँ यह फ़ील्ड 1 पर सेट है। लेबल पाठ अभिव्यक्ति के लिए इसका उपयोग करें ...
if ( "showlabel" is not null, "ELEV", "")
मुझे लगता है कि अगर (अभिव्यक्ति, सत्य-मूल्य, गलत-मूल्य) काफी नया है; यदि पुराने संस्करण का उपयोग कर रहे हैं, तो आप CASE-ELSE का उपयोग कर सकते हैं
रेखा की शैली बदलें ताकि निश्चित लंबाई खंड सभी खींचे जा सकें, उन खंडों को छोड़कर जहां लेबल प्रदर्शित किया गया है। इसलिए दो नियमों के साथ नियम-आधारित प्रतिपादन का उपयोग करें
Rule 1: "showLabel" is null
Black, 0% transparent
Rule 2: "showLabel" is not null
Any colour, 100% transparent
अब, सभी आकृति डिफ़ॉल्ट रूप से दिखेंगी, लेकिन कोई लेबल नहीं।
उन क्षेत्रों को मैन्युअल रूप से संपादित करें जहाँ आप लेबल दिखाना चाहते हैं
संपादन मोड में जाएं और मैन्युअल रूप से उन खंडों का चयन करें जहां आप समोच्च मान प्रदर्शित करना चाहते हैं, और showLabel
चयनित सुविधाओं के लिए 1 से 1 का मान सेट करें । आप चीजों को गति देने के लिए बहु-चयन खंडों के लिए Ctrl+ चयन (उबंटू / विन, Cmd+ Ctrl+ क्लिक / मैक पर?) का उपयोग कर सकते हैं ।
इसे अब उन कंट्रोल्स को 'क्लिप' करना चाहिए जहां आप लेबल दिखाना चाहते हैं, और लेबल अंतराल में दिखेंगे।
इस मामले में, मेरी लेबल सेटिंग्स थीं:
CRS: EPSG 27700 (Local UTM for UK, in meters)
Text size: 50 map units
Placement: Parallel, On Line
उम्मीद है की वो मदद करदे!
मैं "लेबल सेटिंग" टैब पर "बफर" विकल्प का उपयोग करता हूं। (लेबल्स बटन का उपयोग करके, लेयर प्रॉपर्टीज़ डायलॉग पर पुराने लेबल्स विकल्प का उपयोग नहीं किया जाता है।) यह समोच्च रेखा को मिटा नहीं देता है, जैसा कि मुझे लगता है कि आप करना चाहते हैं, लेकिन यह लेबल को सुपाठ्य बनाता है।
मुझे लगता है कि मौजूदा क्यूजीआईएस क्षमताओं के साथ यह निकटतम हो सकता है तालिका से रंगे हुए हेलो (या पृष्ठभूमि) प्रभाव का उपयोग करना है जो कि उच्च मूल्य और रंग योजना पर आधारित होगा जैसा कि अंतर्निहित ग्रिड के लिए उपयोग किया जाता है। निश्चित रूप से यह पहाड़ियों और नक्शों में प्रभामंडल के नीचे की सभी चीजों को ध्यान में नहीं रखेगा । यादृच्छिक रंग उदाहरण: कोड के कुछ बिट के साथ ग्रिड रंग को प्रतिबिंबित करने के लिए फ़ंक्शन के रूप में इसे फिर से लिखा जा सकता है।
सिद्धांत रूप में कस्टम लाइन पैटर्न और लेबल रिपीट + ऑफसेट का उपयोग करना संभव होना चाहिए । दुर्भाग्य से कोई लेबल ऑफसेट सेटिंग नहीं है।
हाल ही में एक ही समस्या में चलने के बाद मैंने भारी उठाने के लिए QGIS पायथन स्क्रिप्ट को एक साथ रखा है। कुछ (यूके) परीक्षण डेटा, रीडमी (गाइड) और इस्तेमाल की जाने वाली शैली पत्रक सहित स्क्रिप्ट https://github.com/pjgeng/Contour-Labels पर पाई जा सकती है
संक्षेप में स्क्रिप्ट इनपुट के रूप में दो वेक्टर परतों का उपयोग करती है - एनोटेट समोच्च परत और एक "गाइड" परत। उत्तरार्द्ध में वांछित लेबल स्थानों पर आकृति को भेदने वाले पॉलीइन्स होते हैं।
स्क्रिप्ट फिर कंट्रोस और इंडेक्स कॉन्टूर अंतराल के बीच की दूरी के आधार पर काम करती है, जिसे लागू करने के लिए लेबल, लेबल बिंदुओं के लिए एक रोटेशन मूल्य जोड़ता है और अंततः अंतराल को उत्पन्न करने के लिए मूल समोच्च परत को क्लिप करता है।
दृष्टिकोण विशेष रूप से अच्छी तरह से काम करता है उपयोगकर्ता को एक ही क्षेत्र में अलग-अलग अंतराल पर समोच्च नक्शे बनाने की आवश्यकता होनी चाहिए (यानी गाइड नहीं बदलते हैं)। स्क्रिप्ट समाप्त हो जाने के बाद लेबल की स्थिति बदलने में एक खामी है। इसके लिए उपयोगकर्ता को गाइड लाइनों को समायोजित करना होगा और मूल इनपुट के खिलाफ स्क्रिप्ट को फिर से जोड़ना होगा। मैंने पहले लेबल के आसपास बफ़र्स के साथ काम किया था ताकि बाधित प्रभाव पैदा किया जा सके, लेकिन यह वेक्टर डेटा चालित नक्शों पर सौंदर्य के दृष्टि से अप्रिय साबित हुआ।
दुर्भाग्य से मैं इस समय किसी और चित्र को दस्तावेज़ में शामिल नहीं कर सकता या प्रक्रिया को आगे नहीं बढ़ा सकता।
पुनश्च: यदि रिपॉजिटरी में प्रदान की गई स्टाइल लेयर्स का उपयोग कर रहे हैं, तो लेबलिंग मेनू में "रोटेशन", "शो लेबल" और "ऑलवेज शो" के लिए कस्टम फ़ील्ड को "सक्रिय" करने की आवश्यकता हो सकती है। QGIS के कुछ इंस्टॉलेशन पर ये स्टाइलशीट से स्वचालित रूप से लागू होते हैं - मुझे अभी तक यह पता नहीं चला है कि इसके कारण क्या हैं।
यहां QGIS समोच्च-लेबल-मास्किंग समस्या का एक और समाधान है, जहां मैं लेबल प्लेसमेंट के लिए एक ज्यामिति जनरेटर के साथ QGIS 'स्पैटियालाइट कार्यक्षमता (वर्तमान में QGIS 3.x) का लाभ उठाता हूं।
यह बहुत ही गतिशील समाधान हमें सभी लेबल पाठ आकार और लेबल पदों को तुरंत बदलने की अनुमति देता है, और यहां तक कि एक पीडीएफ वेक्टर निर्यात भी बचता है!
इसे संभव बनाने के लिए हमें निम्नलिखित भागों की आवश्यकता है:
नियम आधारित स्टाइल के साथ एक आभासी परत जिसे "contours_with_labels" कहा जाता है:
नियम 2: ELSE… सरल रेखा
और नियम 1 के लिए एक सशर्त लेबल पाठ:
कब से लेबल = 1 तब ऊंचाई ELSE '' END
make_line (start_point ($ ज्यामिति), end_point ($ ज्यामिति)
विशेषता (get_feature ('सेटिंग', 'चर', 'contourlabel_size'), 'मान')
और अंतिम लेकिन कम से कम, यहाँ आभासी परत के लिए SQL क्वेरी नहीं है:
------------------------------------------------------------------------
-- select all contour lines that do not intersect any scratch lines
------------------------------------------------------------------------
select c.geometry,c.elev,0 as label
from contours c,
(select st_union(geometry) as geom from scratch_lines) as scr
where not st_intersects(c.geometry,scr.geom)
------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all scratch lines (bufferwidth = length(elevation_text) * txtsize/3),
-- get st_difference between contour lines and buffers
-- and set attribute "label" to 0
--------------------------------------------------------------------------------------------------------
select st_difference(c.geometry,buf.geom) as geom,c.elev,0 as label
from
(select c.fid,st_union(st_buffer(scr.geometry,length(c.elev) * txtsize.value / 3)) as geom
from scratch_lines scr,
contours c,
(select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(scr.geometry,c.geometry)
group by c.fid) as buf,
contours c
where c.fid = buf.fid
group by c.fid
--------------------------------------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all scratch lines (bufferwidth = length(elevation_text) * txtsize/3),
-- get st_intersection between contour lines and buffers
-- and set attribute "label" to 1
--------------------------------------------------------------------------------------------------------
select st_intersection(st_buffer(scr.geometry,length(c.elev) * txtsize.value / 3),c.geometry) as geom,c.elev,1 as label
from scratch_lines scr,
contours c,
(select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(c.geometry,scr.geometry)
बस।
इन सभी उत्साही लोगों को बहुत धन्यवाद, जो इसे संभव बनाते हैं!
क्या आपको यह धागा मार्टिन याद है ? जिस तरह से मैं आपकी समस्या के समाधान के लिए पास होने के बारे में सोच सकता हूं, वह यह है कि आपकी समोच्च परत को एक क्लिपर समोच्च परत के साथ ओवरले किया जाएगा, लेबलिंग के लिए इसका उपयोग करें और रेखा के रंग को कुछ तटस्थ में बदल दें जो लेबल के तहत आकृति को मुखौटा कर देगा, एक उम्मीद के बिना भी घुसपैठ हो रही है। एन
बाद में जोड़ा गया: यह इस धागे को भी देखने लायक हो सकता है, दूसरा उत्तर। शायद समोच्च रेखाओं को तोड़ना एक उत्तर हो सकता है, शायद आकृति को क्लिप करने के लिए उपयोग की जाने वाली बफर परत का उपयोग करना?
लेबलों को अधिक परिपूर्ण बनाने के लिए, मैंने समोच्च रेखाओं के समानांतर चलने वाली स्क्रैच लाइनों का सम्मान करने के लिए वर्चुअल लेयर की SQL क्वेरी को बदल दिया (नीचे समाधान देखें):
और यहाँ आभासी परत के लिए नया एसक्यूएल है:
------------------------------------------------------------------------
-- select all contour lines that do not intersect any scratch lines
------------------------------------------------------------------------
select c.geometry,c.elev,0 as label
from contours c,
(select st_union(geometry) as geom from scratch_lines) as scr
where not st_intersects(c.geometry,scr.geom)
------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all intersection points (bufferwidth = length(elevation_text) * txtsize/2.5),
-- get st_difference between contour lines and buffers
-- and set attribute "label" to 0
--------------------------------------------------------------------------------------------------------
select st_difference(c.geometry,buf.geom) as geom,c.elev,0 as label
from contours c,
(select c.fid,st_union(st_buffer(st_intersection(c.geometry,scr.geometry),length(c.elev) * txtsize.value / 3)) as geom
from contours c, scratch_lines scr, (select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(c.geometry,scr.geometry)
group by c.fid) as buf
where c.fid = buf.fid
--------------------------------------------------------------------------------------------------------
UNION
--------------------------------------------------------------------------------------------------------
-- create buffers around all intersection points (bufferwidth = length(elevation_text) * txtsize/2.5),
-- get st_intersection between contour lines and buffers
-- and set attribute "label" to 1
--------------------------------------------------------------------------------------------------------
select st_intersection(c.geometry,st_buffer(st_intersection(c.geometry,scr.geometry),length(c.elev) * txtsize.value / 3)) as geom,c.elev,1 as label
from contours c,
scratch_lines scr,
(select cast(value as integer) as value from settings where variable = 'contourlabel_size') txtsize
where st_intersects(c.geometry,scr.geometry)
ESRI ब्लॉग प्रविष्टि: http://blogs.esri.com/esri/arcgis/2011/11/28/variable-depth-masking-contour-label-example/
समोच्च लेबल के लिए चर-गहराई मास्किंग में तीन चरण शामिल हैं:
1 लेबल से एनोटेशन, मास्क बनाने के लिए फ़ीचर आउटलाइन मास्क टूल को 2 फ्यूच करना और एडवांस्ड ड्रॉइंग ऑप्शन्स को 3 फ्यूज़ करना> मास्किंग सेटिंग्स को निर्दिष्ट करने के लिए कि कौन से लेयर्स मास्क को बाहर निकालेंगे।