बिंदु विशेषताओं के आधार पर एटलस कैसे बनाएं?


9

मूलतः मैं एक बिंदु परत में एक श्रेणीगत क्षेत्र के आधार पर एक एटलस का उत्पादन करना चाहता हूं।

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

मैं इसे एक-एक करके कर सकता था, लेकिन ऐसा लगता है कि प्रत्येक श्रेणी के विस्तार के आधार पर एटलस बनाने का कोई तरीका होना चाहिए? (मुझे लगता है मैं कुछ स्पष्ट याद कर रहा हूँ :))

या वैकल्पिक रूप से एक बहुभुज परत के निर्माण को स्वचालित करने और एटलस के लिए एक छिपी कवरेज के रूप में उपयोग करने का एक तरीका है?

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



धन्यवाद क्रिस - लेकिन यकीन नहीं अगर यह है। यह पूछ रहा है कि क्या आप प्रत्येक क्षेत्र के लिए एक मूल एटलस में उप-एटलस कर सकते हैं? 4 क्षेत्रों में से प्रत्येक 4 पृष्ठों के साथ? (हालांकि मैंने जो कुछ भी पूछा जा रहा था उसका पालन करने के लिए संघर्ष किया)
जोनोपैटर्सन

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

इसके अलावा, आपके मामले में आप एक ही विशेषता साझा करने वाले प्रत्येक बिंदु के विस्तार के आधार पर बाउंडिंग बॉक्स उत्पन्न कर सकते हैं और फिर उन्हें अपनी अनुक्रमणिका सुविधाओं के रूप में उपयोग कर सकते हैं, लेकिन आप अभी भी अंकों के विभिन्न समूहों को स्वचालित रूप से चालू और बंद करने की समस्या से बचे हुए हैं। । यहां तक ​​कि अगर आप उन्हें अलग-अलग परतों में विभाजित करते हैं, तो बिना किसी प्रकार की परिभाषा क्वेरी के किसी भी पृष्ठ पर उन बिंदुओं को बंद करने का कोई तरीका नहीं है।
क्रिस डब्ल्यू

हाँ अपने मृत पर यह भी इस एक gis.stackexchange.com/questions/121802/… का दोहराव है - इसलिए मुझे इसे मैन्युअल रूप से करने का सहारा लेना पड़ सकता है।
जोनोपाटर्सन

जवाबों:


9

मैंने आखिरकार इसे अपने उद्देश्यों के लिए हल कर लिया है, इसलिए यहाँ समाधान है अगर मैं किसी के साथ मदद करता हूं:

एक पाइथन स्क्रिप्ट लिखें (इसके अंत में मेरा) जो अनिवार्य रूप से ऐसा करता है:

  1. ब्याज की बिंदु परत क्षेत्र में अद्वितीय श्रेणियों की पहचान करें
  2. प्रत्येक श्रेणी के लिए, सभी मिलान बिंदुओं का चयन करें और इस सेट की सीमा स्थापित करें
  3. प्रत्येक सीमा के लिए एक महत्वपूर्ण विशेषता "श्रेणीनाम" के साथ रिक्त एटलस कवरेज परत में एक नया बहुभुज उत्पन्न करें

इसने मुझे एटलस कवरेज लेयर दी, जिसमें एक बहुभुज इस तरह की रुचि के प्रत्येक श्रेणी के लिए है: एटलस कवरेज परत

सामान्य के अनुसार एटलस और प्रिंट कंपोज़र को कॉन्फ़िगर करें - केवल ऑन और ऑफ फीचर्स के मुद्दे को छोड़कर।

इसके लिए विकल्पों के सटीक सेट को काम करने के लिए परीक्षण और त्रुटि का एक छोटा सा हिस्सा है:

  1. नीचे दी गई अभिव्यक्ति से आपको वर्तमान में एटलस फीचर के लिए श्रेणीनाम क्षेत्र में रखा गया मान मिल सकता है

    attribute ($atlasfeature, 'CategoryName') 
    
  2. की परत के साथ बिंदु परत के लिए नियम आधारित स्टाइल बनाने के लिए इसका उपयोग करें

    attribute ($atlasfeature, 'CategoryName') = PointCategory AND PointCategory = "RedDots"
    
  3. मेरे पास यह गारंटी देने का भी नियम था कि अन्य सभी पारदर्शी हों

    attribute ($atlasfeature, 'CategoryName') IS NOT PointCategory
    

नियम दिखाए गए

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

अंतिम एटलस सेट:

सुविधा आधारित एटलस

संपादित करें - जैसा कि इसके लिए कहा गया था, यहाँ मेरी स्क्रिप्ट है:

    from PyQt4.QtCore import *

#main script----------------------------------------------
    #set up the layer references - you will need to change this
targetlayer=QgsMapLayerRegistry.instance().mapLayer("AtlasExtents20150727154732521")
eylayer = QgsMapLayerRegistry.instance().mapLayer("Early_Years_Providers20150727152919862")

#establish the unique categories 
names = getUniqueAttributes(eylayer, 'Mapping_La')

#get a set of boxes
boxset = getBoundings(eylayer, names)

#ensure layer is emptied, then add bounding boxes
deleteBoxes(targetlayer)
createBoxes(targetlayer, boxset)
 #end main script----------------------------------------------   


 #------functions-------#
#gets unique set of attributes - returns a set()
def getUniqueAttributes(layer, fieldname):
    values = set()
    for feature in layer.getFeatures():
        values.add(feature[fieldname])
    return values

#quickly selects all points on a layer, given a query 
def selectionQuick(layer, queryitem):
    layer.removeSelection ()

    #hardcoded field name
    expr = QgsExpression( "\"Mapping_La\" = '" + queryitem +"'")
    it = layer.getFeatures( QgsFeatureRequest( expr ) )
    ids = [i.id() for i in it]
    layer.setSelectedFeatures( ids )

#for a set of unique items, get bounding boxes 
def getBoundings(layer, itemset):
    bboxes = {}
    for itemname in itemset:
        selectionQuick(layer,itemname)
        box = layer.boundingBoxOfSelected()
        bboxes[itemname] = box
    return bboxes

#for a layer create a bunch of boxes
def createBoxes(layer, boxes):
    id=0
    for boxkey in boxes:
        id = id +1
        box=boxes[boxkey]
        feat = QgsFeature(layer.pendingFields())
        geom = QgsGeometry.fromRect(box)
        feat.setAttribute('id', id)
        #hardcoded field name
        feat.setAttribute('CareType', boxkey)
        feat.setGeometry(geom)
        (res, outFeats) = layer.dataProvider().addFeatures([feat])

def deleteBoxes(layer):
        ids = [f.id() for f in layer.getFeatures()]
        layer.dataProvider().deleteFeatures( ids )

3
@JonoPatterson अगर आप अब अपने अजगरों की स्क्रिप्ट को कथित रूप से साझा करेंगे, तो यह अब तक का सबसे अच्छा जवाब होगा;)
बर्ड वी।

ओके ऐसा करेगा - हालाँकि इसके रफ एन तैयार है इसलिए इसे कुछ ट्विक्स की आवश्यकता होगी (वर्षों से कोई कोडिंग नहीं की है!)। इसका सबसे अच्छा तरीका क्या है - बस एक कोडबॉक्स में पेस्ट करें?
जोनोपाटर्सन

@JonoPatterson स्क्रिप्ट के लिए बहुत बहुत धन्यवाद। मेरे लिए एक शुरुआत के रूप में, यह पहले से ही बहुत अच्छा लग रहा है :)। मुझे यकीन है कि मुझे जल्द ही इसकी आवश्यकता होगी।
बेरंड वी।

आपके उदाहरण के भाव थोड़े गलत हैं - यह "$ एटलसफ्रीचर" होना चाहिए, न कि "$ एटलसफ्रीचरिड"
ndawson
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.