मानचित्र पर ऐन्टेना प्रतीकों को दिखाना: बिंदु प्रतीकों या सुविधाओं (बहुभुज)


12

मैं एक मानचित्र पर एक सेलुलर नेटवर्क दिखाना चाहता हूं। इनपुट डेटा एक .csv फ़ाइल है जहां प्रत्येक स्ट्रिंग एक सेलुलर सेक्टर है। विशेषताएँ इस प्रकार हैं: सेक्टर आईडी, इसके निर्देशांक, इसके अज़ीमुथ और एंटीना बीम चौड़ाई का कोण।

एंटीना बीम चौड़ाई मान 30 से 360 डिग्री की सीमा में हैं। 360 ऐन्टेना बीम चौड़ाई का मतलब है कि इसे एक सर्कल के रूप में मानचित्र पर दिखाया जाना चाहिए। अन्य बीम चौड़ाई वाले एंटेना को उपयुक्त एपर्चर कोण वाले क्षेत्रों के रूप में दिखाया जाना चाहिए।

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

क्या केवल प्रतीकों का उपयोग करके एंटेना दिखाना संभव है? मुझे पता है कि अपना खुद का SVG सिंबल कैसे बनाया जाए और आशा है कि यह कैसे अज़ीमथ के अनुसार घुमाया जाए। लेकिन क्या 30 से 360 डिग्री के गुण मान के अनुसार वैरिएबल एंटीना बीम की चौड़ाई को लागू करने का कोई तरीका है?

मुझे लगता है कि प्रतीकों को दृश्य के पैमाने के अनुसार मानचित्र पर गतिशील दृश्य के कारण एंटेना खींचने का सबसे अच्छा तरीका है, अगर यह तरीका QGIS में संभव है।

बेशक, इस कार्य को एक उपयुक्त विशेषता के रूप में उपयुक्त बहुभुज खींचकर हल किया जा सकता है, लेकिन यह एक समाधान समाधान होगा।


तो आपको आर्क को सही दिशा में खींचने की आवश्यकता है जो प्रत्येक साइट के लिए अलग है?
नाथन डब्ल्यू

बिल्कुल नहीं अगर मैं ठीक से समझूं। यह चित्र में दिखाए गए अनुसार सर्कल का एक क्षेत्र (या बीम्यूलेशन = 360 के पूरे सर्कल) होना चाहिए।
ई बोबरोव

हाँ, मेरा यही मतलब है।
नाथन डब्ल्यू

ठीक है मैं समझा। सामान्य रूप से आर्क प्रतीक को बोलने की कड़ाई से आवश्यकता नहीं है। मुख्य गुण अज़ीमुथ और बीमकारी हैं। मैं किसी भी प्रतीक को केवल एक चाप नहीं खींचने के लिए किसी भी प्रतीक का उपयोग कर सकता हूं।
ई बोबरोव

संभवतः मुझे उदाहरण मिला है जो मदद कर सकता है: कस्टम प्रतीक परत प्रकार बनाना । लेकिन मुझे यकीन नहीं है। तो किसी ने अपने स्वयं के प्रतीक परत वर्ग को बनाने की कोशिश की जो उदाहरण के लिए प्रत्येक परत विशेषता दिशा को अपनी विशेषता (यानी ऊपर चित्र के शब्दों में एंटीना अज़ीमुथ) के आधार पर आकर्षित करता है?
ई बोबरोव

जवाबों:


7

कुछ दिनों पहले QGIS में एक नया प्लगइन जोड़ा गया था जिसे वेज बफर प्रोसेसिंग अल्गोरिथम कहा जाता है । ऐसा लगता है कि यह ब्याज की हो सकती है।

जैसा कि नाम से पता चलता है कि यह एक प्रोसेसिंग एल्गोरिथ्म है, इसलिए आपको इसे प्रोसेसिंग टूलबॉक्स से चलाने की आवश्यकता होगी। हालांकि अभी तक इसे आज़माने का मौका नहीं मिला था।

यह सामान्य सर्कुलर बफर की तरह ही सर्किलों के सेक्टर बनाता है, लेकिन वेज एंगल और त्रिज्या को फील्ड वैल्यू का इस्तेमाल करके सेट किया जा सकता है।

प्रलेखन और स्क्रीनशॉट जीथूब पेज पर देखे जा सकते हैं


10

यदि आप केवल सहजीवन का उपयोग करना चाहते हैं, तो मैं एक समान प्रश्न से मेरे उत्तर से प्रेरित समाधान का प्रस्ताव करता हूं: QGIS में सेक्टर लाइट्स बनाना?


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

इसके अलावा, मुझे लगता है कि "AZIMUTH"वह क्षेत्र है जो अज़ीमुथ मूल्यों को संग्रहीत करता है और "BEAMWIDTH"वह क्षेत्र है जो एंटीना बीम की चौड़ाई को संग्रहीत करता है।

समाधान

हम Single symbolएक Simple Markerऔर दो Geometry generatorप्रतीक परतों के आवर्ती के साथ अंक प्रस्तुत करेंगे :

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

आगे की व्याख्या में, मैं ऊपर की छवि में प्रतीकों के उसी क्रम का पालन करूंगा।

1) सरल मार्कर

मैंने एक लाल वृत्त का डिफ़ॉल्ट प्रतीक चुना (यह इस ट्यूटोरियल का सबसे आसान हिस्सा है), जिसका आकार 3 मिमी और चौड़ाई 0.4 मिमी है।

2) ज्यामिति जनरेटर नंबर 1

एक नई प्रतीक परत जोड़ें Geometry generatorऔर LineString / MultiLineStringप्रकारों का चयन करें :

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

इस एक्सप्रेशन को Expressionफ़ील्ड में डालें :

make_line(
 $geometry,
 make_point($x + 300*cos(radians(90 -  "AZIMUTH" )), $y + 300*sin(radians((90 - "AZIMUTH" ))))
)

हमने केवल उस तीर को परिभाषित किया है जो azimuth सेट की ओर इंगित करता है (तीर बनाने के लिए, मुख्य प्रतीक मेनू से विकल्प के Arrowतहत प्रतीक परत प्रकार का चयन करना याद रखें Line)। कृपया ध्यान दें कि 300मीटर में एक दूरी का प्रतिनिधित्व करता है और यह एक मनमाना मूल्य है, इसलिए अपनी आवश्यकताओं के अनुसार इसे बदलने के लिए स्वतंत्र महसूस करें।

3) ज्यामिति जनरेटर नंबर 2

एक नई प्रतीक परत जोड़ें और Geometry generatorप्रकार और Polygon / MultiPolygonप्रकार चुनें:

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

इस एक्सप्रेशन को Expressionफ़ील्ड में डालें :

CASE
WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   $geometry, 200),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      $geometry,
      make_point($x + 2000*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + 2000*cos(radians(90 -  "AZIMUTH" )), $y + 2000*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      $geometry)
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   $geometry, 200),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       $geometry,
       make_point($x + 2000*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + 2000*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - 2000*cos(radians(90 -  "AZIMUTH" )), $y - 2000*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + 2000*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + 2000*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       $geometry)
      )
     )
    )
   )

END

हमने सिर्फ सेक्टर को परिभाषित किया है। कृपया ध्यान दें कि 200और 2000मीटर में दूरी का प्रतिनिधित्व करते हैं और वे मनमाने ढंग से मान हैं क्योंकि मैं चक्र 200 मीटर की परिधि होने के साथ विभाजित करने में एक बहुभुज बनाने के लिए कोशिश कर रहा हूँ, इसलिए उन्हें अपनी आवश्यकताओं के अनुसार बदल सकते हैं।

अंतिम परिणाम

यदि आप पिछले कार्यों को सही ढंग से करते हैं, तो आपको इन लोगों की तरह परिणाम प्राप्त करने में सक्षम होना चाहिए (इस समाधान के अलावा लेबल जोड़े जाते हैं और उन्हें केवल बेहतर संदर्भ बताना चाहिए):

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

ध्यान दें

यदि आप जियोग्राफिक कोऑर्डिनेट सिस्टम का उपयोग कर रहे हैं , अर्थात यदि आप डिग्रियों के साथ काम कर रहे हैं, न कि दूरी के साथ, तो यह उचित मूल्यों का उपयोग करने के लिए पर्याप्त होना चाहिए जब मैंने पिछले फॉर्मूले में दूरी का उपयोग किया हो। मैंने जिन दूरियों का उपयोग किया है वे हैं:

  • 300 मीटर (ज्यामिति जनरेटर नंबर 1 देखें);
  • 200 मीटर (ज्यामिति जनरेटर नंबर 2 देखें);
  • 2000 मीटर (ज्यामिति जनरेटर नंबर 2 देखें);

इसलिए आप इसे डिग्री में व्यक्त अन्य मनमानी मूल्यों (उदाहरण के लिए 0.0002, 0.002और इसी तरह) से बदल सकते हैं।

बक्शीश

मैंने यहां शैली संलग्न की है : आप इस कोड को किसी भी टेक्स्ट एडिटर के साथ खोल सकते हैं और इसे QGIS लेयर स्टाइल फाइल (यानी .qmlएक्सटेंशन के साथ ) के रूप में सहेज सकते हैं ।

उपरोक्त शैली QGIS 2.18.4 का उपयोग करके बनाई गई थी (इसमें उसी आकार का नाम होना चाहिए जिसका आप उपयोग कर रहे हैं)।


क्या आप इस समाधान की तलाश में थे? क्या यह काम करता है?
मैगरी

आपका विलेपन पूरी तरह से विषय में वर्णित मामले को हल करता है! मैंने इसे लागू किया और समझा कि मेरा अपना वास्तविक मामला थोड़ा अलग है। क्षमा करें कि मेरी गलती है।
ई बोब्रोव

1) मानचित्र पर मेरे क्षेत्रों का घनत्व कमज़ोर है, अर्थात सेक्टरों के बीच कम दूरी के मामले में कोड में परिभाषित दूरी बहुत सारे क्षेत्रों को ओवरलैपिंग देगी, मैप ज़ूम को बदलने में मदद नहीं करेगा, इसलिए यह कठिन होगा नक्शा पढ़ने के लिए। लेकिन सेक्टरों के बीच लंबी दूरी के मामलों में दिखाया गया है कि सेक्टर बहुत छोटे होंगे और शायद नक्शा पढ़ना मुश्किल होगा। एकल प्रतीकों का उपयोग करना इस समस्या से मुक्त है, नक्शे के ज़ूमिंग के साथ उनके पैमाने बदल जाते हैं।
ई बोब्रोव

2) और किरण-प्रसार विकृतियाँ हैं: बीम-चालन 360 डिग्री, दीर्घवृत्त की तरह दिखते हैं, अलग-अलग अज़ीमुथ वाले क्षेत्र लेकिन समान बीम-विन्यास समतुल्य बीमविथ्स वाले क्षेत्रों की तरह नहीं दिखते। क्या ऐसा इसलिए है क्योंकि मैं भौगोलिक समन्वय प्रणाली का उपयोग कर रहा हूं? अब आप, देशांतर / अक्षांश के विभिन्न कोण पृथ्वी पर बिंदुओं के बीच भिन्न दूरी का प्रतिनिधित्व करते हैं। तो हल करने के लिए आवश्यक है कि पृथ्वी उन क्षेत्रों में स्थानीय हो जहां सेक्टर स्थित हैं।
ई बोब्रोव

वैसे भी आपके समाधान और इसी तरह के जवाब के लिए संदर्भ "QGIS में सेक्टर लाइट्स बनाना?" मुझे कुछ उपयोगी कार्यक्षमता देखने में मदद की। फिर से धन्यवाद।
ई बोबरोव

4

बिग कुदोस से मैगरी।

हमारी परीक्षण परत में, सब कुछ सुचारू रूप से काम करता था। एक उत्पादन परत में, दो / तीन घंटे के बाद, मैं $ ज्यामिति के साथ एक मुद्दे को ट्रैक करने में कामयाब रहा । एक मंच से एक बिंदु परत निर्यात कर रहा था, नोटिस नहीं लिया, लेकिन यह मल्टीपाउन था । यह मुद्दों का कारण लग रहा था: तीर खींचा नहीं गया था; और अजीब तरह से केवल गणना किए गए बिंदुओं ने हलकों के बहुभुज को बनाया।

एक और बात मैं एक चर त्रिज्या का उपयोग कर रहा हूँ । (निश्चित नहीं कि अगर इस मामले में सही शब्द है, तो आप इसे 'बीम की लंबाई' या जो भी नाम दे सकते हैं)।

यहां मैं अभी उपयोग कर रहा हूं, एक मल्टीपॉइंट ज्यामिति प्रकार परत के साथ (जबकि वास्तव में सभी विशेषताएं एक ही बिंदु हैं), और यह मेरे लिए QGis 2.18.3 में काम करता है

तीर अभिव्यक्ति अगर कोई तीर 360 °।

CASE

WHEN ("BEAMWIDTH") = 360
THEN 
make_line(
 make_point($x, $y),
 make_point($x + "RADIUS"*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*sin(radians((90 - "AZIMUTH" ))))
)

END

बहुभुज अभिव्यक्ति

CASE

WHEN ("BEAMWIDTH") <= 180
THEN
intersection(
  buffer(
   make_point($x,$y), "RADIUS"),
  make_polygon(
   geom_from_wkt(
    geom_to_wkt(
     make_line(
      make_point($x,$y),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
      make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
      make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
      make_point($x,$y))
     )
    )
   )
  )

WHEN ("BEAMWIDTH") > 180
THEN
difference(
  buffer(
   make_point($x,$y), "RADIUS"),
   make_polygon(
    geom_from_wkt(
     geom_to_wkt(
      make_line(
       make_point($x,$y),
       make_point($x + "RADIUS"*2*cos(radians(90 -  "AZIMUTH" - "BEAMWIDTH"/2 )), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" - "BEAMWIDTH"/2 )))),
       make_point($x - "RADIUS"*2*cos(radians(90 -  "AZIMUTH" )), $y - "RADIUS"*2*sin(radians((90 - "AZIMUTH" )))),
       make_point($x + "RADIUS"*2*cos(radians(90 - "AZIMUTH" + "BEAMWIDTH" /2)), $y + "RADIUS"*2*sin(radians((90 - "AZIMUTH" + "BEAMWIDTH"/2)))),
       make_point($x,$y))
      )
     )
    )
   )

END

मेरे उत्तर ने एक सामान्य दृष्टिकोण का प्रस्ताव दिया: चूंकि मुद्दे में बहुत सारे चर शामिल थे, इसलिए इस स्थिति को हल करने के लिए एक अनूठी प्रक्रिया बनाना काफी असंभव था। तो, इसे इंगित करने के लिए धन्यवाद और मल्टीप्वाइंट सुविधाओं के साथ एक दृष्टिकोण का प्रस्ताव, यह निश्चित रूप से भविष्य में किसी की मदद करेगा।
mgri

1

मुझे वेब में किसी भी अतिरिक्त प्लगइन्स के बिना आंशिक समाधान के साथ उपहार दिया गया था, बस बॉक्स से बाहर qgis। यह एंटीना बीम एक्सपोज़र को नहीं दिखाता है, बस साधारण मार्कर को सही दिशा में घुमाएं: सरल मार्कर का उपयोग करें और इसे एंटीना एजुथ + 180 डिग्री (लेयर प्रॉपर्टीज> सिंगल सिंबल-> मार्कर-> सिंपल मार्कर-> ट्राइएंगल-> रोटेशन- एडिट) के साथ घुमाएं। -> अभिव्यक्ति क्षेत्र में <180 + "एंटीना अज़ीमुथ"> टाइप करें। और मार्कर के एंकर बिंदु क्षेत्र में भी शीर्ष सेट करें)। एम्बेडिंग सरल त्रिभुज मार्कर की अनुचित दिशा की वजह से <180 + "एंटीना अज़ीमुथ"> का उपयोग करना आवश्यक है। अन्यथा यह गलत एंटीना दिशा दिखाएगा।

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