โหลดโปรแกรมแต่งเพลงจากแม่แบบและสร้างแผนที่โดยใช้ PyQGIS


10

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

ฉันไม่สามารถเพิ่มเลเยอร์ใด ๆ ในตำนาน (ซึ่งอยู่ใน toc) ลงในแผนที่ที่ส่งออกซึ่งส่งผลให้แผนที่ว่างเปล่าและไม่มีการแสดงออกของฟิลด์ใดทำงาน

    # Get layers in the legend and append, must be a cleaner way to do this?
    layers = self.iface.legendInterface().layers()
    layerStringList = []
    for layer in layers:
        layerID = layer.id()
        layerStringList.append(layerID)

    # Add layer to map render
    myMapRenderer = QgsMapRenderer()
    myMapRenderer.setLayerSet(layerStringList)
    myMapRenderer.setProjectionsEnabled(False)

    # Load template
    myComposition = QgsComposition(myMapRenderer)
    myFile = os.path.join(os.path.dirname(__file__), 'MMR_Template.qpt')
    myTemplateFile = file(myFile, 'rt')
    myTemplateContent = myTemplateFile.read()
    myTemplateFile.close()
    myDocument = QDomDocument()
    myDocument.setContent(myTemplateContent)
    myComposition.loadFromTemplate(myDocument)

    # Save image
    myImagePath = os.path.join(os.path.dirname(__file__), 'come_on.png')
    myImage = myComposition.printPageAsRaster(0)
    myImage.save(myImagePath)

นี่คือตัวอย่างจากเทมเพลตที่โหลดซึ่งควรตั้งค่าแอตลาส:

 <Atlas hideCoverage="false" featureFilter="reference = '61922'"    coverageLayer="desktop_search20130615160118593" fixedScale="true" composerMap="0" singleFile="false" filenamePattern="&quot;reference&quot;" enabled="true" filterFeatures="true" sortFeatures="true" sortKey="0" sortAscending="true" margin="1"/>

ฉันไม่แน่ใจในวิธีที่ดีที่สุดในการเพิ่มเลเยอร์ทั้งหมดใน toc ไปยังอินสแตนซ์ของ QgsMapRenderer ()

ขอบคุณ

คำตอบ:


18

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

def sort_toc(self):

    # Turn on/off layers as required by search type
    legend = self.iface.legendInterface()
    layers = legend.layers()
    wanted_layers = metal_wanted
    global turn_on, turn_off, atlas_desktop
    turn_off = []
    turn_on = []
    all_layers = []
    for layer in layers:
        layername = layer.name()
        all_layers.append(layername)
        layerid = layer.id()
        if layername == "desktop_search":
            atlas_desktop = layer
        if layername in wanted_layers and legend.isLayerVisible(layer) is False:
            turn_off.append(layer)
            legend.setLayerVisible(layer, True)
        if layername not in wanted_layers and legend.isLayerVisible(layer) is True:
            turn_on.append(layer)
            legend.setLayerVisible(layer, False)
        else:
            pass

    # Checks for required layers missing from map file
    for layer in wanted_layers:
        missing = []
        if layer not in all_layers:
            missing.append(layer)
        else:
            pass
    if not missing:
        pass
    else:
        QMessageBox.warning(self.iface.mainWindow(), "Missing layers", "Required layers are missing from your map file. Details: %s" % (str(missing)))
    return atlas_desktop

def quick_export(self, ref, stype, scale):

    # Add all layers in map canvas to render
    myMapRenderer = self.iface.mapCanvas().mapRenderer()

    # Load template from file
    myComposition = QgsComposition(myMapRenderer)
    myFile = os.path.join(os.path.dirname(__file__), 'MMR_Template.qpt')
    myTemplateFile = file(myFile, 'rt')
    myTemplateContent = myTemplateFile.read()
    myTemplateFile.close()
    myDocument = QDomDocument()
    myDocument.setContent(myTemplateContent)
    myComposition.loadFromTemplate(myDocument)

    # Get map composition and define scale
    myAtlasMap = myComposition.getComposerMapById(0)
    myAtlasMap.setNewScale(int(scale))

    # Setup Atlas
    myAtlas = QgsAtlasComposition(myComposition)
    myAtlas.setCoverageLayer(atlas_desktop) # Atlas run from desktop_search
    myAtlas.setComposerMap(myAtlasMap)
    myAtlas.setFixedScale(True)
    myAtlas.fixedScale()
    myAtlas.setHideCoverage(False)
    myAtlas.setFilterFeatures(True)
    myAtlas.setFeatureFilter("reference = '%s'" % (str(ref)))
    myAtlas.setFilterFeatures(True)

    # Generate atlas
    myAtlas.beginRender()
    for i in range(0, myAtlas.numFeatures()):
        myAtlas.prepareForFeature( i )
        jobs = r"\\MSUKSERVER\BusinessMan Docs\Jobs"
        job_fol = os.path.join(jobs, str(ref))
        output_jpeg = os.path.join(job_fol, ref + "_BMS_plan.jpg")
        myImage = myComposition.printPageAsRaster(0)
        myImage.save(output_jpeg)
    myAtlas.endRender()

def return_toc(self):

    # Revert layers back to pre-script state (on/off)
    legend = self.iface.legendInterface()
    for wanted in turn_on:
        legend.setLayerVisible(wanted, True)
    for unwanted in turn_off:
        legend.setLayerVisible(unwanted, False)

คุณสามารถแบ่งปันตัวอย่างการใช้งานสำหรับฟังก์ชั่นต่าง ๆ ที่คุณสร้างขึ้นได้หรือไม่? นี่คือทั้งหมดที่อยู่ใน QGIS Python Console หรือไม่
ฟาเอล

@raphael ฉันสร้างปลั๊กอินนี้มาระยะหนึ่งแล้ว แต่ฉันจะพยายามขุดตัวอย่าง
Matt

ขอบคุณ Matt ที่แบ่งปันสิ่งนี้กับเรา เป็นไปได้หรือไม่ที่จะได้รับตัวอย่างการใช้งานฟังก์ชั่นเหล่านี้? ขอบคุณมาก ! ขอแสดงความนับถือ Nathan
Nat Lebo

2

บางทีนี่อาจทำงานกับคุณเพื่อรับเลเยอร์ปัจจุบันทั้งหมด:

registry = QgsMapLayerRegistry.instance()
layers = registry.mapLayers().values()

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