5 votos

¿Cómo hacer capas en png en una aplicación independiente?

Me gustaría usar independiente appliction a aplicar .qml a un estilo de capa y utilizar QgsMapRenderer() para guardarlo como imagen en un disco duro. Son un montón de preguntas como la mía en este sitio y parece que la mayoría de los problemas que surgen de ajustes por QgsApplication(). Por desgracia parece que yo no era capaz de instalación QgsApplication() de una manera correcta. Mi código es bastante estándar, código de representación de PyQGIS libro de cocina que se utiliza como una plantilla en otras cuestiones como la mía. Se produce transparente .png inage con la capa no prestados. A pesar de que este código funciona (sin inicialización de QgsApplication()) si lo corrió línea por línea, en QGIS consola (QGIS 2.4).

Así que he siguientes QgsApplication() valores (Alt Linux).

Application state:
QGIS_PREFIX_PATH env var:       
Prefix:     /usr
Plugin Path:        /usr/lib64/qgis
Package Data Path:  /usr/share/qgis
Active Theme Name:  
Active Theme Path:  :/images/themes//
Default Theme Path: :/images/themes/default/
SVG Search Paths:   /usr/share/qgis/svg/
User DB Path:   /usr/share/qgis/resources/qgis.db 

El código en sí:

from qgis.core import * 
from qgis.utils import *
from qgis.gui import *
from PyQt4.QtCore import QSize
from PyQt4.QtGui import QPainter, QImage, QColor

QgsApplication.setPrefixPath('/usr', True)
QgsApplication.initQgis()
print QgsApplication.showSettings()


lyr = QgsVectorLayer('test.shp', 'points', 'ogr')
lyr_id = lyr.id()
QgsMapLayerRegistry.instance().addMapLayer(lyr)
lyr.loadNamedStyle( 'test.qml')


# create image
img = QImage(QSize(800, 600), QImage.Format_ARGB32_Premultiplied)

# set image's background color
# color = QColor(255, 255, 255)
# img.fill(color.rgb())

# create painter
p = QPainter()
p.begin(img)
p.setRenderHint(QPainter.Antialiasing)

layers = QgsMapLayerRegistry.instance().mapLayers()
lst = layers.keys()
print 'lst', lst
renderer = QgsMapRenderer()
renderer.setLayerSet(lst)

extent = renderer.fullExtent()
rect = QgsRectangle(extent)
# print rect.toString()
rect.scale(1.1)
renderer.setExtent(rect)

# set output size
renderer.setOutputSize(img.size(), img.logicalDpiX())

# do the rendering
renderer.render(p)
p.end()

# save image
img.save('test.png', 'png')

QgsApplication.exitQgis()

3voto

puchu Puntos 317

He hecho una cosas similar, mi trabajo. Mira esto. Es para 2,14 qgis. Si están bloqueadas usted probablemente debe comprobar http://docs.qgis.org/2.2/en/docs/pyqgis_developer_cookbook/raster.html (ver el número de versión en el enlace)

3voto

Elliott Maynard Puntos 11

Yo tengo que trabajar en mi GNU/Linux de la máquina mediante la sustitución de este bloque de código de la secuencia de comandos:

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

por este:

qgisApp = QgsApplication([], True)
QgsApplication.setPrefixPath('/usr', True)
QgsApplication.initQgis()

La primera línea de este bloque de código que inicializa el QgsApplication de la clase, dejando en claro (segundo conjunto de parámetros a True) que queremos una interfaz gráfica de usuario de aplicaciones habilitadas, no solo de la consola. Después de todo, el guión se basa en algunas de Qt4 GUI clases.

He probado usando QGIS 2.14.1. Espero que esto aclare tu pregunta.

Por el camino, no hay necesidad de importar nada de qgis.utils ni qgis.gui.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X