ऊंचाई लेबल के नीचे समोच्च लाइनों को कैसे बाधित करें (लेबल बफ़र्स का उपयोग करने के बजाय)?


32

क्या एक ऊंचाई लेबल के नीचे एक समोच्च रेखा को बाधित करने का एक तरीका है?

यहाँ छवि विवरण दर्ज करें


ArcGIS? QGIS? कस्टम?
रागी यासर बुरहुम

1
मैं समोच्च लेबलिंग के लिए क्यूगिस का उपयोग करता हूं
एमएपी

क्या आप एक उत्तर स्वीकार करेंगे जिसके लिए PostGIS की आवश्यकता है?
स्क्रू

3
दुर्भाग्य से: नहीं :) लेकिन, क्या पोस्टगिस के साथ समस्या को हल करने का कोई तरीका है?
एमएपी

जवाबों:


22

हाँ, उल्लेखनीय है। आम तौर पर मैं आंशिक रूप से पारदर्शी बफर का सुझाव देता हूं, लेकिन मैं देखता हूं कि आप यह क्यों करना चाहते हैं।

यह धीमा हो सकता है, और आपको मैन्युअल रूप से यह तय करने की आवश्यकता है कि आप लेबल कहाँ जाना चाहते हैं - लेकिन कार्टोग्राफिक रूप से, यह कोई बुरी बात नहीं है!

यहां देखें एक स्क्रीनशॉट ...

जैसा कि आप देख सकते हैं, कोई बफ़र्स नहीं। नीचे का रास्‍ता अप्रभावित है। मैंने पतले मध्यवर्ती समोच्च लाइनों को शामिल किया है, और उन्हें स्टाइल किया है ताकि वे केवल दिखाए जा सकें जब ELEV% 50 <> 0

बाधित समोच्च लाइनों का उदाहरण

मैंने इसे QGIS 2.12 में किया है ... आपका माइलेज पहले के संस्करणों के साथ भिन्न हो सकता है।

मैं यहाँ मानता हूँ कि आपके पास प्रत्येक समोच्च रेखा पर "ELEV" फ़ील्ड है।

समोच्च रेखाओं को विभाजित करें

  1. समान लंबाई वाले खंडों में अपने आकृति को विभाजित करने के लिए प्रोसेसिंग और GRASS एल्गोरिथम v.split.length का उपयोग करें । आपको एक लंबाई चुनने की ज़रूरत है जो मानचित्र इकाइयों में आपके लेबल के आकार के करीब होगी, यह मानते हुए कि आप मीटर का उपयोग कर रहे हैं। यहां मैंने 200 मी।

    इससे सावधान रहें क्योंकि यह आपकी फ़ाइल को बहुत बड़ा बना देगा (स्क्रीनशॉट में फीचर की गणना करता है)।

    इसके आस-पास जाने के लिए, आप सभी मध्यवर्ती रेखाओं को संसाधित करने से बचने के लिए केवल उन आकृति लाइनों को उत्पन्न करना चाहते हैं जिन्हें आप शैली (जैसे हर 50 या 100 मीटर) चाहते हैं।

  2. इस लेयर में, showLabel नामक 1 अंकीय पूर्णांक फ़ील्ड जोड़ें । डिफ़ॉल्ट 0 या NULL के लिए।

  3. लेबल को केवल उस खंड पर दिखाने के लिए बदलें जहाँ यह फ़ील्ड 1 पर सेट है। लेबल पाठ अभिव्यक्ति के लिए इसका उपयोग करें ...

    if ( "showlabel" is not null, "ELEV", "")
    

    मुझे लगता है कि अगर (अभिव्यक्ति, सत्य-मूल्य, गलत-मूल्य) काफी नया है; यदि पुराने संस्करण का उपयोग कर रहे हैं, तो आप CASE-ELSE का उपयोग कर सकते हैं

  4. रेखा की शैली बदलें ताकि निश्चित लंबाई खंड सभी खींचे जा सकें, उन खंडों को छोड़कर जहां लेबल प्रदर्शित किया गया है। इसलिए दो नियमों के साथ नियम-आधारित प्रतिपादन का उपयोग करें

    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

उम्मीद है की वो मदद करदे!


5
यह केवल एक पूरी तरह से काम कर रहा समाधान है जिसकी मैं कल्पना कर सकता हूं। बहुत दर्दनाक है, अगर कई लेबल हैं, तो मैं इस तरह से अपने सभी भूजल सिर के नक्शे (प्रति वर्ष हजारों) करने की कल्पना नहीं कर सकता। बहुत अच्छा होगा अगर भविष्य में यह शैली के माध्यम से प्राप्त हो - सबसे अच्छा होगा कस्टम लाइन पैटर्न और लेबल रिपीट + ऑफसेट।
मिरो

2
कार्य को आसान बनाने के लिए कुछ विचार: लेबल खींचने के लिए कई खंडों का चयन करने के लिए, बहुभुज द्वारा चयन करें या फ़्रीहैंड द्वारा चयन करना आसान हो सकता है। इसके अलावा, एक और aproach एक स्क्रैच लाइन लेयर बनाकर लाइनों को खींचेगा जो कि कंट्रास्ट को इंटरसेप्ट करता है, और फिर लोकेशन सेलेक्ट करें।
अलेक्जेंड्रे नेटो

7

मैं "लेबल सेटिंग" टैब पर "बफर" विकल्प का उपयोग करता हूं। (लेबल्स बटन का उपयोग करके, लेयर प्रॉपर्टीज़ डायलॉग पर पुराने लेबल्स विकल्प का उपयोग नहीं किया जाता है।) यह समोच्च रेखा को मिटा नहीं देता है, जैसा कि मुझे लगता है कि आप करना चाहते हैं, लेकिन यह लेबल को सुपाठ्य बनाता है।


4
मैंने इसके बारे में पहले कभी नहीं सोचा था, लेकिन यह सुविधाजनक होगा यदि बफर के लिए एक रंग निर्दिष्ट करने के बजाय, आप इसे चयनित परतों के लिए 'नॉकआउट' के रूप में लागू कर सकते हैं।
Scro

5
QGIS के नवीनतम संस्करण में पारदर्शी बफ़र्स हैं ताकि आप मानचित्र के अन्य भागों पर प्रभाव को कम कर सकें।
नाथन डब्ल्यू

1
@ एमएपी ए नॉकआउट के तहत पिक्सल को मिटा देता है। यदि वह एक विकल्प था, तो इस मामले में आप समोच्च परत को खटखटाना चुनेंगे।
स्क्रो

1
नॉकआउट - ESRI शब्द "मास्किंग" है resources.arcgis.com/en/help/main/10.1/index.html#//...
माइक

1
@MAP - एक डेवलपर को प्रायोजित करें, या एक सुविधा अनुरोध सबमिट करें और दूसरों के परोपकार पर प्रतीक्षा करें। :)
23

5

मुझे लगता है कि मौजूदा क्यूजीआईएस क्षमताओं के साथ यह निकटतम हो सकता है तालिका से रंगे हुए हेलो (या पृष्ठभूमि) प्रभाव का उपयोग करना है जो कि उच्च मूल्य और रंग योजना पर आधारित होगा जैसा कि अंतर्निहित ग्रिड के लिए उपयोग किया जाता है। निश्चित रूप से यह पहाड़ियों और नक्शों में प्रभामंडल के नीचे की सभी चीजों को ध्यान में नहीं रखेगा । यादृच्छिक रंग उदाहरण: लेबल के प्रभामंडल प्रभाव के लिए यादृच्छिक रंग कोड के कुछ बिट के साथ ग्रिड रंग को प्रतिबिंबित करने के लिए फ़ंक्शन के रूप में इसे फिर से लिखा जा सकता है।

सिद्धांत रूप में कस्टम लाइन पैटर्न और लेबल रिपीट + ऑफसेट का उपयोग करना संभव होना चाहिए । दुर्भाग्य से कोई लेबल ऑफसेट सेटिंग नहीं है।

  • कुछ परीक्षण के बाद क्यूजीआईएस को सटीक अंतराल में लेबल रखने के साथ सख्त होने के लिए मजबूर करना असंभव है और कहीं नहीं (+ गायब ऑफसेट सामग्री)
  • स्पेस के लिए शून्य मिमी के साथ कस्टम लाइन पैटर्न बनाना असंभव है, जिसमें 20 लाइन - 10 स्पेस - 70 लाइन - 0 स्पेस - जैसे ऑफ़सेट शुरू होंगे, इसलिए लेबल को शुरुआत में 30 मिमी ऑफसेट के साथ हर 100 मिमी रखा जाएगा - जिसका अर्थ लेबल में होगा हर 10 मिमी छेद के बीच में।

यहाँ छवि विवरण दर्ज करें


2

हाल ही में एक ही समस्या में चलने के बाद मैंने भारी उठाने के लिए QGIS पायथन स्क्रिप्ट को एक साथ रखा है। कुछ (यूके) परीक्षण डेटा, रीडमी (गाइड) और इस्तेमाल की जाने वाली शैली पत्रक सहित स्क्रिप्ट https://github.com/pjgeng/Contour-Labels पर पाई जा सकती है

संक्षेप में स्क्रिप्ट इनपुट के रूप में दो वेक्टर परतों का उपयोग करती है - एनोटेट समोच्च परत और एक "गाइड" परत। उत्तरार्द्ध में वांछित लेबल स्थानों पर आकृति को भेदने वाले पॉलीइन्स होते हैं।

स्क्रिप्ट फिर कंट्रोस और इंडेक्स कॉन्टूर अंतराल के बीच की दूरी के आधार पर काम करती है, जिसे लागू करने के लिए लेबल, लेबल बिंदुओं के लिए एक रोटेशन मूल्य जोड़ता है और अंततः अंतराल को उत्पन्न करने के लिए मूल समोच्च परत को क्लिप करता है।

अंतिम परिणाम का क्लोजअप।

दृष्टिकोण विशेष रूप से अच्छी तरह से काम करता है उपयोगकर्ता को एक ही क्षेत्र में अलग-अलग अंतराल पर समोच्च नक्शे बनाने की आवश्यकता होनी चाहिए (यानी गाइड नहीं बदलते हैं)। स्क्रिप्ट समाप्त हो जाने के बाद लेबल की स्थिति बदलने में एक खामी है। इसके लिए उपयोगकर्ता को गाइड लाइनों को समायोजित करना होगा और मूल इनपुट के खिलाफ स्क्रिप्ट को फिर से जोड़ना होगा। मैंने पहले लेबल के आसपास बफ़र्स के साथ काम किया था ताकि बाधित प्रभाव पैदा किया जा सके, लेकिन यह वेक्टर डेटा चालित नक्शों पर सौंदर्य के दृष्टि से अप्रिय साबित हुआ।

दुर्भाग्य से मैं इस समय किसी और चित्र को दस्तावेज़ में शामिल नहीं कर सकता या प्रक्रिया को आगे नहीं बढ़ा सकता।

पुनश्च: यदि रिपॉजिटरी में प्रदान की गई स्टाइल लेयर्स का उपयोग कर रहे हैं, तो लेबलिंग मेनू में "रोटेशन", "शो लेबल" और "ऑलवेज शो" के लिए कस्टम फ़ील्ड को "सक्रिय" करने की आवश्यकता हो सकती है। QGIS के कुछ इंस्टॉलेशन पर ये स्टाइलशीट से स्वचालित रूप से लागू होते हैं - मुझे अभी तक यह पता नहीं चला है कि इसके कारण क्या हैं।


2

यहां QGIS समोच्च-लेबल-मास्किंग समस्या का एक और समाधान है, जहां मैं लेबल प्लेसमेंट के लिए एक ज्यामिति जनरेटर के साथ QGIS 'स्पैटियालाइट कार्यक्षमता (वर्तमान में QGIS 3.x) का लाभ उठाता हूं।

यह बहुत ही गतिशील समाधान हमें सभी लेबल पाठ आकार और लेबल पदों को तुरंत बदलने की अनुमति देता है, और यहां तक ​​कि एक पीडीएफ वेक्टर निर्यात भी बचता है!

यहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करें

इसे संभव बनाने के लिए हमें निम्नलिखित भागों की आवश्यकता है:

  1. एक "लाइनिंग" या "मल्टीलाइनिंग" वेक्टर परत जिसे 2 क्षेत्रों के साथ "आकृति" कहा जाता है: "फिड" (इंटरजेर64 - प्राथमिक कुंजी), "ऊँचाई" (स्ट्रिंग)
  2. एक "LINESTRING" वेक्टर परत जिसे "scratch_lines" कहा जाता है (चित्र में लाल रेखाएं देखें)
  3. वैश्विक समोच्च-लेबल आकार को संग्रहीत करने के लिए "सेटिंग" नामक एक ज्यामिति-कम तालिका (यह एक सरल वर्कअराउंड है, क्योंकि क्यूजीआईएस अब तक एसक्यूएल प्रश्नों में प्रोजेक्ट चर का उपयोग नहीं कर सकते हैं): "fid" (Integer64 - प्राथमिक कुंजी), "चर" (स्ट्रिंग), "मूल्य" (स्ट्रिंग)

यहाँ छवि विवरण दर्ज करें

  1. नियम आधारित स्टाइल के साथ एक आभासी परत जिसे "contours_with_labels" कहा जाता है:

    • नियम 1: "लेबल" = 1 ... सरल रेखा, अपारदर्शिता 0%
    • नियम 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)

बस।

इन सभी उत्साही लोगों को बहुत धन्यवाद, जो इसे संभव बनाते हैं!


मुझे कहना होगा, मैं परिणाम से प्रभावित हूं। जब तक हमें एक अंतर्निहित विकल्प नहीं मिलता है (यदि कभी हो), तो यह निश्चित रूप से सबसे साफ तरीका है। बचाव के लिए आभासी परतों, फिर से।
गेब्रियल सी

मैं वास्तव में खुद से प्रभावित था। लेकिन, क्या यह वास्तव में बड़े समोच्च परतों को खड़ा कर सकता है?
क्रिसमस

और मुझे बहुत खुशी है, इसे जांचने के बाद, कि यह जियोपैकेज में डेटा के साथ भी काम करता है! मैं यह सत्यापित करना चाहता था कि यह स्थानिक आधार पर आधारित है। काश मैं एक बार से अधिक वोट सकता है ...
गेब्रियल सी

IMHO, यह किसी भी फ़ाइल प्रारूप से स्वतंत्र है, क्योंकि क्वेरी QGIS के अंदर चल रही है। तो यह सीएसवी के साथ भी काम करना चाहिए।
क्रिसमस

ऐसा लगता है कि यह कहानी का अंत नहीं है। आज एक शोध के बाद, मुझे एहसास हुआ कि हम वर्चुअल लेयर SQL क्वेरी के अंदर QGIS एक्सप्रेशन फ़ंक्शंस का उपयोग कर सकते हैं: gis.stackexchange.com/questions/320991/… । इसलिए अभी और भी बहुत कुछ है, जो लेबल मास्किंग को गति देगा (मैं स्केल पर निर्भर प्रश्नों के बारे में सोच रहा हूं या स्थानिक अनुक्रमित का बेहतर उपयोग कर रहा हूं)।
क्रिसमस

1

क्या आपको यह धागा मार्टिन याद है ? जिस तरह से मैं आपकी समस्या के समाधान के लिए पास होने के बारे में सोच सकता हूं, वह यह है कि आपकी समोच्च परत को एक क्लिपर समोच्च परत के साथ ओवरले किया जाएगा, लेबलिंग के लिए इसका उपयोग करें और रेखा के रंग को कुछ तटस्थ में बदल दें जो लेबल के तहत आकृति को मुखौटा कर देगा, एक उम्मीद के बिना भी घुसपैठ हो रही है। एन

बाद में जोड़ा गया: यह इस धागे को भी देखने लायक हो सकता है, दूसरा उत्तर। शायद समोच्च रेखाओं को तोड़ना एक उत्तर हो सकता है, शायद आकृति को क्लिप करने के लिए उपयोग की जाने वाली बफर परत का उपयोग करना?


1

लेबलों को अधिक परिपूर्ण बनाने के लिए, मैंने समोच्च रेखाओं के समानांतर चलने वाली स्क्रैच लाइनों का सम्मान करने के लिए वर्चुअल लेयर की 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)

1

मूल प्रश्न से संबंधित एक छोटा सा परिशिष्ट।

उन सभी के लिए जो इस तथ्य से अवगत नहीं हैं कि हम QGIS 3.10 में अपनी समोच्च रेखाओं को सरल और सुचारू बनाने के लिए "ज्यामिति जनरेटर" स्टाइल का उपयोग कर सकते हैं:

चिकनी (सरल करें ($ ज्यामिति, 2), 2)

यहाँ छवि विवरण दर्ज करें


0

ESRI ब्लॉग प्रविष्टि: http://blogs.esri.com/esri/arcgis/2011/11/28/variable-depth-masking-contour-label-example/

समोच्च लेबल के लिए चर-गहराई मास्किंग में तीन चरण शामिल हैं:

1 लेबल से एनोटेशन, मास्क बनाने के लिए फ़ीचर आउटलाइन मास्क टूल को 2 फ्यूच करना और एडवांस्ड ड्रॉइंग ऑप्शन्स को 3 फ्यूज़ करना> मास्किंग सेटिंग्स को निर्दिष्ट करने के लिए कि कौन से लेयर्स मास्क को बाहर निकालेंगे।


यह दिखाता है कि इसे कैसे लागू किया जा सकता है, लेकिन यह वास्तव में इस सवाल का जवाब नहीं देता है।
UnderDark
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.