প্রোগ্রামিয়ালি টেমপ্লেট থেকে সুরকারকে লোড করুন এবং পাইকিজিআইএস ব্যবহার করে অ্যাটলাস তৈরি করুন


10

আমি ফাইল থেকে একটি মুদ্রণ সুরকারকে লোড করতে, একটি অ্যাটলাস তৈরি করতে এবং চিত্রটিতে রফতানি করার জন্য একটি প্লাগিন তৈরির চেষ্টা করছি। এখন পর্যন্ত আমি টেমপ্লেট লোড এবং এটি ইমেজ রফতানি করতে সফল হয়েছে।

আমি রফতানি করা মানচিত্রে কিংবদন্তির কোনও স্তর (যা টোকায়ও রয়েছে) যোগ করতে অক্ষম হয়েছি, যার ফলশ্রুতি খালি ম্যাপে এবং ক্ষেত্রের এক্সপ্রেশনগুলির কোনওটিই কাজ করছে না।

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

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)

আপনি তৈরি বিভিন্ন ফাংশনের জন্য ব্যবহারের উদাহরণগুলি ভাগ করতে পারেন? এটি কি কিউজিআইএস পাইথন কনসোলের মধ্যে রয়েছে?
রাফেল

@ ইরফেল আমি বেশ কিছুক্ষণ আগে এই প্লাগইনটি তৈরি করেছি, তবে আমি একটি উদাহরণ খুঁজে বের করার চেষ্টা করব।
ম্যাট

আমাদের সাথে এটি ভাগ করে নেওয়ার জন্য ম্যাট আপনাকে ধন্যবাদ। এই ফাংশনগুলির জন্য ব্যবহারের উদাহরণ পাওয়া সম্ভব? অনেক ধন্যবাদ ! শুভেচ্ছা, নাথান
নাট লেবো

2

সম্ভবত এটি আপনার বর্তমান সমস্ত স্তর পাওয়ার জন্য কাজ করতে পারে:

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

আহ আপনার সমস্ত স্তর
পাওয়ার উপায়টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.