পাইথন ব্যবহার করে প্রিন্ট / ম্যাপ কিউজিআইএস সুরকারের ভিউ পিএনজি / পিডিএফ হিসাবে সংরক্ষণ করুন (দৃশ্যমান বিন্যাসে কোনও পরিবর্তন না করে)?


11

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

আমি বর্তমান লেআউটে কোনও পরিবর্তন করতে চাই না। বেশিরভাগ উদাহরণ যা আমি পেয়েছি (উদাহরণস্বরূপ: এটি ), আমি আমার বর্তমান সুরকার ভিউতে যা দেখছি তার সাথে তুলনা করে পিডিপিতে মানচিত্রের অবস্থান বা আকার পরিবর্তন করুন। আমি মুদ্রণ -> চিত্র হিসাবে রফতানিতে ক্লিক করলে আমার ঠিক একই ফলাফলটি পেতে চাই ।

আমি এটা কিভাবে করবো? অ্যাটলাস আমার পক্ষে সমাধান নয়।

উত্তর:


7

আমি টিম সুতনের নীচের স্ক্রিপ্টটি বেস হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি, এটি আমার পক্ষে ভাল কাজ করেছে: - http://kartoza.com/how-to-create-a-qgis-pdf-report-with-a-few-lines- অফ পাইথন /

তিনি ব্যবহার করেন এমন 'প্রতিস্থাপনের মানচিত্রের' পরিবর্তে কেবল একটি ফাঁকা ডিক পাস করুন। লোড থেকে ফর্মটেম্পলেট () ফাংশনটি, কারণ আপনি সেই কার্যকারিতাটিতে আগ্রহী নন।

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

নীচে টিমের কোডের একটি পরিবর্তিত সংস্করণ রয়েছে যা বাহ্যিক পাইথন স্ক্রিপ্ট থেকে কাজ করে কৌশলটি করা উচিত। প্রয়োজনীয় হিসাবে ডিপিআই এবং প্রকল্প + রচয়িতা ফাইল ভেরিয়েবল সেট করুন।

(আপনি যদি বাহ্যিক স্ক্রিপ্ট হিসাবে এটি না করে কিউজিআইএসের মধ্যে পাইথন কনসোল ব্যবহার করেন তবে আপনি বর্তমান মানচিত্রের ক্যানভাসটি কুইগিস.ফেস ব্যবহার করে পেতে পারেন এবং সমস্ত প্রকল্প লোডিং কোড ব্যবহার করার প্রয়োজন নেই)।

import sys
from qgis.core import (
    QgsProject, QgsComposition, QgsApplication, QgsProviderRegistry)
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from PyQt4.QtCore import QFileInfo
from PyQt4.QtXml import QDomDocument

gui_flag = True
app = QgsApplication(sys.argv, gui_flag)

# Make sure QGIS_PREFIX_PATH is set in your env if needed!
app.initQgis()

# Probably you want to tweak this
project_path = 'project.qgs'

# and this
template_path = 'template.qpt'

# Set output DPI
dpi = 300

canvas = QgsMapCanvas()
# Load our project
QgsProject.instance().read(QFileInfo(project_path))
bridge = QgsLayerTreeMapCanvasBridge(
    QgsProject.instance().layerTreeRoot(), canvas)
bridge.setCanvasLayers()

template_file = file(template_path)
template_content = template_file.read()
template_file.close()
document = QDomDocument()
document.setContent(template_content)
ms = canvas.mapSettings())
composition = QgsComposition(ms)
composition.loadFromTemplate(document, {})
# You must set the id in the template
map_item = composition.getComposerItemById('map')
map_item.setMapCanvas(canvas)
map_item.zoomToExtent(canvas.extent())
# You must set the id in the template
legend_item = composition.getComposerItemById('legend')
legend_item.updateLegend()
composition.refreshItems()

dpmm = dpi / 25.4
width = int(dpmm * composition.paperWidth())
height = int(dpmm * composition.paperHeight())

# create output image and initialize it
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill(0)

# render the composition
imagePainter = QPainter(image)
composition.renderPage(imagePainter, 0)
imagePainter.end()

image.save("out.png", "png")

QgsProject.instance().clear()
QgsApplication.exitQgis()

আমি আপনার কোড ব্যবহার করতে আগ্রহী। যাইহোক, আমি একটি খালি মানচিত্র পাচ্ছি ... আপনার যদি কোনও ধারণা থেকে থাকে তবে আমি এটি সম্পর্কে এখানে একটি প্রশ্ন পোস্ট করেছি: gis.stackexchange.com/questions/216376/…
ব্যবহারকারী 25976

আমি এটি ব্যবহার করতে আগ্রহী। আমি মনে করি আমি বেশ কাছাকাছি, তবে আমি 'এট্রিবিউটআরার:' কিউজস কমপোজার আইটেম 'এর কোনও' সেটম্যাপক্যানভাস 'নেই বলে' আমি সেখান থেকে কোথায় যাব সে সম্পর্কে আমার ক্ষতি হচ্ছে।
জামিরিওব

এই উত্তরের লিঙ্কটিতে আমি কীভাবে কোডটি সন্ধান করতে পারি? আমি দুটি ভিন্ন ব্রাউজারে চেষ্টা করেছি এবং পোষ্টের বাইরে যে "উদাহরণ" উল্লেখ করা হয়েছে তা খুঁজে পাচ্ছি নাpython generate_pdf.py
রাফেল

3

আপনি নিজের দ্বারা এটিকে প্রোগ্রাম করতে পারেন বা Maps Printerপ্লাগইন থেকে কোনও পদ্ধতি পুনরায় ব্যবহার করতে পারেন । আমি দ্বিতীয় বিকল্পটি বর্ণনা করব কারণ এটি সহজ।

আপনার Maps Printerপ্লাগইন ইনস্টল থাকা দরকার, আপনার কনফিগার করা সুরকারের সাথে কিউজিআইএস প্রকল্পটি খুলুন, কিউজিআইএস পাইথন কনসোলটি খুলুন এবং এই কোড স্নিপেট চালনা করুন ( Your settingsবিভাগে আপনার নিজের সেটিংসের সাথে এটি অ্যাডজাস্ট করতে হবে )।

# Your settings
composerTitle = 'my composer' # Name of the composer you want to export
folder = '/path/to/export_folder/'
extension = '.png' # Any extension supported by the plugin

mp = qgis.utils.plugins['MapsPrinter']

for composer in iface.activeComposers():
    title = composer.composerWindow().windowTitle()
    if title == composerTitle:
        mp.exportCompo( composer, folder, title, extension )
        break

এটি চালানোর পরে, আপনি একটি নতুন ফাইলটি শেষ করবেন /path/to/export_folder/my composer.png। আপনি '.pdf'পিডিএফ হিসাবে সুরকার এক্সপোর্ট করতে এক্সটেনশন হিসাবেও ব্যবহার করতে পারেন ।


3

আমার অন্যান্য উত্তরটির দিকেও নজর দিন কারণ এটির পর থেকে আরও নতুন আপ-টু-ডেট সরঞ্জাম উদ্ভূত হয়েছে।


আমি নীচের কোডটিতে এসেছি যা দুর্ভাগ্যবশত পুরোপুরি কার্যকর নয়। এটি উপরের সমাধানের ভিত্তিতে এবং অন্যদের প্রশ্নের উপর ভিত্তি করে:

কীভাবে প্রোগ্রাম হিসাবে কোনও রচনাটি চিত্র হিসাবে রপ্তানি করবেন?
এক্সএমএল থেকে আমি কীভাবে QgsPaperItem এর সেটিংস পড়তে পারি?
কিউজিসের সাথে স্বচ্ছ পটভূমির সাথে পিএনজি হিসাবে মানচিত্রের ক্যানভাস সংরক্ষণ করছেন?

আমার কোড একটি .qgs ফাইল থেকে .qpt নিষ্কাশন করতে সক্ষম এবং টেমপ্লেট থেকে সফলভাবে কোনও সুরকারকে লোড করতে সক্ষম। এটি একটি .png ফাইলে কোনও সুরকার মুদ্রণ করে এবং সুরকারে সঞ্চিত সঠিক লেবেল এবং আকার প্রদর্শন করে।

তবে এটি প্রকৃত মানচিত্র ও স্তর সম্পর্কিত সমস্ত উপাদান লোড করতে ব্যর্থ হয়েছে (স্তর থেকে প্রকাশযুক্ত লেবেল আঁকা হয় না)। আমি মনে করি যে প্রকল্পটি কীভাবে লোড করা এবং সুরকারের সাথে সংযুক্ত করতে হবে তা সম্পর্কে আমি কিছুটা মিস করেছি।

টিম সুতনের মূল নিবন্ধের মন্তব্যে কিছু লোক উল্লেখ করেছেন যে তারা উইন্ডোজের অধীনে একই পর্যায়ে আটকে ছিলেন (এটি আমার ক্ষেত্রে)। এটি সত্যিই হতাশার কারণ আমার মনে হচ্ছে উত্তরটি সত্যিই কাছে রয়েছে। প্রিয় ইন্টারনেট দয়া করে সাহায্য করুন!

এছাড়াও পাইথনে এটি আমার প্রথম প্রচেষ্টা তাই আমি আশা করি আপনি দয়াবান হবেন;)

#This python code aim to programmatically export the first composer stored in a qgs file using PyQgis API v 2.10
#Version 0.4 (non functional) WTFPL MarHoff 2015 - This code is mostly a "frankenstein" stub made with a lot of other snippets. Feel welcome to improve!
#Credits to gis.stackexchange community : drnextgis,ndawson,patdevelop,dakcarto,ahoi, underdark & Tim Sutton from kartoza
#More informations and feedback can be found at /gis/144792/

#This script assume your environement is setup for PyGis as a stand-alone script. Some nice hints for windows users : https://gis.stackexchange.com/a/130102/17548

import sys
from PyQt4.QtCore import *
from PyQt4.QtXml import *
from qgis.core import *
from qgis.gui import *

gui_flag = True
app = QgsApplication(sys.argv, gui_flag)

# Make sure QGIS_PREFIX_PATH is set in your env if needed!
app.initQgis()

# Name of the .qgs file without extension
project_name = 'myproject'

#Important : The code is assuming that the .py file is in the same folder as the project
folderPath = QString(sys.path[0])+'/'
projectPath = QString(folderPath+project_name+'.qgs')
templatePath = QString(folderPath+project_name+'_firstcomposer.qpt')
imagePath = QString(folderPath+project_name+'.png')

#Getting project as Qfile and the first composer of the project as a QDomElement from the .qgs
projectAsFile = QFile(projectPath)
projectAsDocument = QDomDocument()
projectAsDocument.setContent(projectAsFile)
composerAsElement = projectAsDocument.elementsByTagName("Composer").at(0).toElement()

#This block store the composer into a template file
templateFile = QFile(templatePath)
templateFile.open(QIODevice.WriteOnly)
out = QTextStream(templateFile)
#I need next line cause UTF-8 is somewhat tricky in my setup, comment out if needed
out.setCodec("UTF-8")
param = QString
composerAsElement.save(out,2)
templateFile.close()

#And this block load back the composer into a QDomDocument
#Nb: This is ugly as hell, i guess there is a way to convert a QDomElement to a QDomDocument but every attemps failed on my side...
composerAsDocument = QDomDocument()
composerAsDocument.setContent(templateFile)

#Now that we got all we can open our project
canvas = QgsMapCanvas()
QgsProject.instance().read(QFileInfo(projectAsFile))
bridge = QgsLayerTreeMapCanvasBridge(
    QgsProject.instance().layerTreeRoot(), canvas)
bridge.setCanvasLayers()


#Lets try load that composer template we just extracted
composition = QgsComposition(canvas.mapSettings())
composition.loadFromTemplate(composerAsDocument, {})


#And lets print in our .png
image = composition.printPageAsRaster(0)
image.save(imagePath,'png')

#Some cleanup maybe?
QgsProject.instance().clear()
QgsApplication.exitQgis()



আমি পূর্ববর্তী কোড থেকে থিস লাইনগুলি বাদ দিয়েছিলাম কারণ তারা দেখে মনে হয় কিছুই করার নেই। তারা কোনও ত্রুটি তৈরি করেছে তবে এর চেয়ে ভাল আর কিছু করতে পারেনি।

# You must set the id in the template
map_item = composition.getComposerItemById('map')
map_item.setMapCanvas(canvas)
map_item.zoomToExtent(canvas.extent())
# You must set the id in the template
legend_item = composition.getComposerItemById('legend')
legend_item.updateLegend()
composition.refreshItems()

এবং সেগুলিও মুছে ফেলা হয়েছে কারণ মুদ্রণপেজএএসআরসিস্টার ব্যবহার করার সময় এগুলি অপ্রয়োজনীয় বলে মনে হয়েছিল ()

dpmm = dpi / 25.4
width = int(dpmm * composition.paperWidth())
height = int(dpmm * composition.paperHeight())    

# create output image and initialize it
image = QImage(QSize(width, height), QImage.Format_ARGB32)
image.setDotsPerMeterX(dpmm * 1000)
image.setDotsPerMeterY(dpmm * 1000)
image.fill(0)    

# render the composition
imagePainter = QPainter(image)
composition.renderPage(imagePainter, 0)
imagePainter.end()

আমি কেবল আনবুন্টু 14.04 সহ একটি ভিএম সেট আপ করেছি এবং এই কোডটি বাতাসের মতো কাজ করে। সুতরাং ইস্যুটি পাইকিগিসের উইন্ডোজ সংস্করণটির সাথে যুক্ত হয়েছে (উইন্ডো 10-তে ওসজিও 4 ডাব্লু 64 ইনস্টল সহ পরীক্ষা করা হয়েছে), আমি দেখতে পাচ্ছি যে কোনও টিকিট ইতিমধ্যে বাগ ট্র্যাকারে খোলা আছে কিনা।
মারহফ

1

আর একটি আপ-টু-ডেট বিকল্প হ'ল কিউজিআইএস সম্প্রদায়ের দ্বারা নির্মিত 2 টি সরঞ্জামের সেটগুলির দিকে নজর দেওয়া। ম্যাপ-স্প্রিন্টর সক্রিয়ভাবে সমর্থিত হওয়ায় আপনার আশা করা উচিত যে স্ক্রিপ্টগুলি কিউজিআইএস-এর আসন্ন সংস্করণগুলির সাথে আপডেট হবে updated

দুটি সরঞ্জামই একটি জিইউআই সরবরাহ করে তবে অন্তর্নিহিত স্ক্রিপ্টগুলি পাইথনে লেখা থাকে

ফাইল রপ্তানি করুন রচয়িতারা - https://github.com/DelazJ/MapsPrinter
রপ্তানি একাধিক প্রকল্প থেকে সুরকার - https://github.com/gacarrillor/QGIS-Resources

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