Lập trình tải trình soạn thảo từ mẫu và tạo tập bản đồ bằng PyQGIS


10

Tôi đang cố gắng xây dựng một plugin để tải một trình soạn thảo in từ tệp, tạo tập bản đồ và xuất thành hình ảnh. Cho đến nay tôi đã thành công trong việc tải mẫu và xuất nó thành hình ảnh.

Tôi đã không thể thêm bất kỳ lớp nào trong chú giải (cũng nằm trong toc) vào bản đồ được xuất, dẫn đến một bản đồ trống và không có biểu thức trường nào hoạt động.

    # 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)

Đây là đoạn trích từ mẫu đã tải sẽ thiết lập tập bản đồ:

 <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"/>

Tôi cũng không chắc chắn về cách tốt nhất để thêm tất cả các lớp trong mã thông báo vào thể hiện của QssMapRenderer ().

Cảm ơn

Câu trả lời:


18

Nếu bất cứ ai quan tâm ở đây là mã tôi đã kết thúc. Điều này sẽ bật / tắt các lớp cụ thể trong mục lục (từ danh sách các lớp), tải mẫu soạn thảo được chọn từ tệp, tạo tập bản đồ và xuất bản đồ. Cuối cùng, trả lại mục lục về trạng thái ban đầu.

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)

Bạn có thể chia sẻ các ví dụ sử dụng cho các chức năng khác nhau mà bạn đã tạo không? Đây có phải là tất cả trong Bảng điều khiển Python của QGIS không?
raphael

@raphael Tôi đã xây dựng plugin này cách đây khá lâu, nhưng tôi sẽ cố gắng khai thác một ví dụ.
Matt

Cảm ơn Matt đã chia sẻ điều này với chúng tôi. Có thể lấy một ví dụ về việc sử dụng cho các chức năng này? Cảm ơn rất nhiều ! Trân trọng, Nathan
Nat Lebo

2

Có lẽ điều này có thể làm việc cho bạn để có được tất cả các lớp hiện tại:

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

ah cách của bạn để có được tất cả các lớp nên hoạt động thực sự
akbargumbira
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.