একা একা স্ক্রিপ্টে মানচিত্রের সুরকার কীভাবে ব্যবহার করবেন?


9

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

আমি যে বিটটি করতে পারি তার জন্য এখানে একক উদাহরণ রয়েছে:

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

QgsApplication.setPrefixPath("/usr/", True)
QgsApplication.initQgis()

fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()

uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
QgsMapLayerRegistry.instance().addMapLayer(layer)
img = QImage(QSize(800,600), QImage.Format_ARGB32_Premultiplied)
color = QColor(255,255,255)
img.fill(color.rgb())
p = QPainter()
p.begin(img)
render = QgsMapRenderer()
lst = [ layer.getLayerID() ]  # add ID of every layer
render.setLayerSet(lst)
rect = QgsRectangle(render.fullExtent())
rect.scale(1.1)
render.setExtent(rect)
render.setOutputSize(img.size(), img.logicalDpiX())
render.render(p)
p.end()
img.save("render.png","png")

আমি সত্যিই যা করতে চাই তা একই, তবে ব্যবহার করুন QgsCompositionএবং উদাহরণস্বরূপ পিডিএফ সংরক্ষণ করুন। কুকবুক বলেছেন:

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

এই বিটটি আমি করতে পারিনি, আমার সমস্ত প্রচেষ্টা খালি মানচিত্র, বা সেগফল্ট পাবে। আমি লিনাক্স পুদিনা 13 চালাচ্ছি, কিগিস 1.8.0 ব্যবহার করে। এটি দুর্দান্ত লাগবে যদি কেউ আমাকে দেখিয়ে দিতে পারেন যে সুরকারকে ব্যবহার করে এমন একজনের কাছে সাধারণ উদাহরণটি কীভাবে পরিবর্তন করতে হয়।

উত্তর:


8

মন্তব্যের উপর ভিত্তি করে, এই উত্তরটি সংস্করণের জন্য কাজ করে2.4
ভবিষ্যতের রেফারেন্সের জন্য, এখানে একটি কার্যকরী একক উদাহরণ।

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

QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
app = QgsApplication([], True)

fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()

uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
print layer.isValid()
layerset = []
QgsMapLayerRegistry.instance().addMapLayer(layer)
layerset.append(layer.getLayerID())

myMapRenderer = QgsMapRenderer()
myMapRenderer.setLayerSet(layerset)
mapRectangle = QgsRectangle(140,-28,155,-15)
myMapRenderer.setExtent(mapRectangle)

comp = QgsComposition(myMapRenderer)
comp.setPlotStyle(QgsComposition.Print)
composerMap = QgsComposerMap(comp, 5,5,200,200)
composerMap.setNewExtent(mapRectangle)
comp.addItem(composerMap)
printer = QPrinter()
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("out.pdf")
printer.setPaperSize(QSizeF(comp.paperWidth(), comp.paperHeight()),    QPrinter.Millimeter)
printer.setFullPage(True)
printer.setColorMode(QPrinter.Color)
printer.setResolution(comp.printResolution())

pdfPainter = QPainter(printer)
paperRectMM = printer.pageRect(QPrinter.Millimeter)
paperRectPixel = printer.pageRect(QPrinter.DevicePixel)
comp.render(pdfPainter, paperRectPixel, paperRectMM)
pdfPainter.end()
app.exitQgis()

যখন আমি এটি করি, আমি একটি পিডিএফ পাই, তবে এটি ফাঁকা। আমি ২.১০ ব্যবহার করছি (আমাকে .getLayerID () to .id ()) পরিবর্তন করতে হবে
Conley Owens

হ্যাঁ, দুঃখিত, এটি আমার পক্ষে আর কাজ করে না। ১.৮.০-তে কাজ করে তবে আমি এটি কেবল ২.৪.০-তে পরীক্ষা করেছি এবং আর কাজ করে বলে মনে হচ্ছে না।
রাজ্জাদ

সুরকারম্যাপ.সেটনিউইউজেক্সট (ম্যাপরেক্টাঙ্গেল) যুক্ত করা এটি কাজ করে মনে হচ্ছে।
রাজ্জাদ

দুর্ভাগ্যক্রমে, এটি আর 2.8.3 এ কাজ করে না। আমি getLayerID () থেকে .id () এ পরিবর্তন করেছি এবং এখনও কেবল একটি ফাঁকা পৃষ্ঠা পেয়েছি। স্থির পাঠ্য রেন্ডারিং ইত্যাদি কাজ করে। সমস্যাটি কী হতে পারে সে সম্পর্কে কোনও ধারণা?
ক্রিশেরিক

QgsMapRenderer মধ্যে অবচিত 2.4এবং উপরোক্ত, এই উত্তর একই উদাহরণ যা কাজ করা উচিত উপর ভিত্তি করে দেখতে gis.stackexchange.com/a/223127/36886
রাফায়েল

3

QgsMapRenderer 2.4 মধ্যে অনুমোদিত নয় এবং সর্বোপরি, আমি থেকে অননুমোদিত অংশ আপডেট করেছি এই উত্তরটি এমন কিছু বিষয় যা থেকে কাজ উচিত 2.4কাছে 2.18.2

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

QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
app = QgsApplication([], True)

fh = open("eg.csv","w")
fh.write("""
x,y,name
153.0278, -27.4679, Brisbane
144.2500, -23.4500, Longreach
145.7753, -16.9256, Cairns
""")
fh.close()

uri = "eg.csv?delimiter=%s&xField=%s&yField=%s" % (",", "x", "y")
layer = QgsVectorLayer(uri, "eglayer", "delimitedtext")
print layer.isValid()
layerset = []
QgsMapLayerRegistry.instance().addMapLayer(layer)
layerset.append(layer.getLayerID())

def create_composition(layer_list, extent):
#New code for versions 2.4 and above
    ms = QgsMapSettings()
    ms.setLayers(layer_list)
    ms.setExtent(extent)
    comp = QgsComposition(ms)
    return comp, ms

comp, ms = create_composition(layerset, QgsRectangle(140,-28,155,-15))

comp.setPlotStyle(QgsComposition.Print)
composerMap = QgsComposerMap(comp, 5,5,200,200)

#Uses mapsettings value
composerMap.setNewExtent(ms.extent())

comp.addItem(composerMap)
printer = QPrinter()
printer.setOutputFormat(QPrinter.PdfFormat)
printer.setOutputFileName("out.pdf")
printer.setPaperSize(QSizeF(comp.paperWidth(), comp.paperHeight()),    QPrinter.Millimeter)
printer.setFullPage(True)
printer.setColorMode(QPrinter.Color)
printer.setResolution(comp.printResolution())

pdfPainter = QPainter(printer)
paperRectMM = printer.pageRect(QPrinter.Millimeter)
paperRectPixel = printer.pageRect(QPrinter.DevicePixel)
comp.render(pdfPainter, paperRectPixel, paperRectMM)
pdfPainter.end()
app.exitQgis()

layer.getLayerID()কাজ করে না এবং এটিকে অবশ্যই পরিবর্তন করতে হবে:layer.id()
কমরেড চে

@ Mr.Che আপনার OS এবং QGIS সংস্করণ অন্তর্ভুক্ত করুন
রাফায়েল

উইন 7 এবং কিউজিআইএস সংস্করণ: i.stack.imgur.com/8u8Ed.png
কমরেড চে

2

সম্ভবত এই কোডটি সহায়ক, যদিও এটি একটি স্বতন্ত্র অ্যাপ্লিকেশন নয়:

from qgis.core import *
from qgis.utils import iface
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import os   
# Clear map canvas
QgsMapLayerRegistry.instance().removeAllMapLayers()
iface.mapCanvas().refresh()
# Open QGIS project
QgsProject.instance().setFileName('composerimage_demo.qgs')
QgsProject.instance().read()
# Set up composition
mapRenderer = iface.mapCanvas().mapRenderer()
c = QgsComposition(mapRenderer)
c.setPlotStyle(QgsComposition.Print)
# Set dimensions and resolution
c.setPaperSize(160,185)
dpi = c.printResolution()
dpmm = (dpi / 25.4)
width = int(dpmm * c.paperWidth())
height = int(dpmm * c.paperHeight())
# Add map to composition
x, y = 0, 0
w, h = c.paperWidth(), c.paperHeight()
composerMap = QgsComposerMap(c, x,y,w,h)
composerMap.setFrame(True) # Does not work with QGIS 1.9-Master. Use hasFrame() instead.
c.addItem(composerMap)
# 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 composition
imagePainter = QPainter(image)
sourceArea = QRectF(0, 0, c.paperWidth(), c.paperHeight())
targetArea = QRectF(0, 0, width, height)
c.render(imagePainter, targetArea, sourceArea)
imagePainter.end()
# Save image to disk (other extensions possible)
image.save('composerimage_demo.jpg')
# Clear map canvas
QgsMapLayerRegistry.instance().removeAllMapLayers()
iface.mapCanvas().refresh()

মানচিত্রটি কিউজিআইএস প্রকল্পের ভিত্তিতে তৈরি। আপনি এখানে একটি সম্পূর্ণ উদাহরণ খুঁজে পেতে পারেন: http://www.qgis.nl/media/2013/08/composerimage_demo.zip


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