{"id":7768,"date":"2018-12-03T07:30:53","date_gmt":"2018-12-03T10:30:53","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=7768"},"modified":"2018-12-04T13:11:19","modified_gmt":"2018-12-04T16:11:19","slug":"desenvolvimento-de-plugins-do-qgis-usando-o-console-parte-2","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2018\/12\/03\/desenvolvimento-de-plugins-do-qgis-usando-o-console-parte-2\/","title":{"rendered":"Desenvolvimento de plugins do QGIS: Usando o console"},"content":{"rendered":"<p>Como mencionado na<a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2018\/11\/29\/desenvolvimento-de-plugins-do-qgis-primeiros-passos-parte-1\/\" rel=\"noopener\" target=\"_blank\"> parte anterior da s\u00e9rie<\/a>, o console Python \u00e9 um ponto de entrada para a automa\u00e7\u00e3o do fluxo de trabalho GIS dentro do QGIS. Lembre-se de que existe um objeto  iface representando a inst\u00e2ncia qgis.gui.QgisInterface dentro do console que lhe d\u00e1 acesso a toda a GUI do QGIS. Vamos ver o que podemos fazer dentro do console.<\/p>\n<p><strong>1. CARREGANDO A PASTA DE CAMADAS VETORIAIS<\/strong><\/p>\n<pre>\r\nimport glob\r\nfrom qgis.core import QgsMapLayerRegistry, QgsVectorLayer\r\n\r\ndef load_folder(folder):\r\n    VALID_EXTENSIONS = ('.geojson', '.gpkg', '.shp')\r\n    files = [f for f in glob.glob(\"{}\/*\".format(folder)) if f.endswith(VALID_EXTENSIONS)]\r\n\r\n    for f in files:\r\n        layer = QgsVectorLayer(f, f.split('\/')[-1], 'ogr')\r\n\r\n        if not layer.isValid():\r\n            iface.messageBar().pushCritical(\"Failed to load:\", f)\r\n            continue\r\n\r\n        QgsMapLayerRegistry.instance().addMapLayer(layer)\r\n\r\nload_folder(\"path\/to\/your\/vector\/files\/folder\")\r\n<\/pre>\n<ul>\n<li><strong>QgsMapLayerRegistry<\/strong> representa o painel de camadas presente na GUI do QGIS <\/li>\n<li><strong>iface.messageBar()<\/strong> retorna a barra de mensagens do aplicativo principal e permite notificar o usu\u00e1rio sobre o que est\u00e1 acontecendo <\/li>\n<li><strong>QgsVectorLayer<\/strong> representa uma camada vetorial com seus conjuntos de dados vetoriais subjacentes <\/li>\n<\/ul>\n<p><strong>2. EDI\u00c7\u00c3O DA TABELA DE ATRIBUTOS DA CAMADA ATIVA<\/strong><\/p>\n<p>O c\u00f3digo a seguir demonstra a possibilidade de editar a tabela de atributos da camada vetorial por meio do console.<\/p>\n<ul>\n<li> Qualquer atributo a ser escrito tem que vir na forma de um <strong>qgis.core.QgsField<\/strong> &#8211; isso \u00e9 mais ou menos um encapsulamento de um nome de atributo e seu tipo  (<strong>PyQt4.QtCore.QVariant<\/strong>) <\/li>\n<li> O provedor de dados deve ser capaz de realizar a atribui\u00e7\u00e3o ( caps &#038; <strong>QgsVectorDataProvider.AddAttributes<\/strong>) <\/li>\n<li> <strong>QgsVectorLayer.addAttribute<\/strong> &#8211; m\u00e9todo que retorna um booleano ao inv\u00e9s de lan\u00e7ar uma exce\u00e7\u00e3o <\/li>\n<\/ul>\n<pre>\r\nfrom qgis.core import QgsField\r\nfrom qgis.gui import QgsMessageBar\r\nfrom PyQt4.QtCore import QVariant\r\n\r\n\r\ndef edit_active_layer(attr_name, attr_type):\r\n    layer = iface.activeLayer()\r\n    caps = layer.dataProvider().capabilities()\r\n\r\n    if caps & QgsVectorDataProvider.AddAttributes:\r\n        layer.startEditing()\r\n        if layer.addAttribute(QgsField(attr_name, attr_type)):\r\n            iface.messageBar().pushMessage(\"Attribute {0} was successfully added to the active layer.\".format(attr_name), QgsMessageBar.SUCCESS)\r\n            layer.commitChanges()\r\n        else:\r\n            iface.messageBar().pushMessage(\"Attribute {0} was not added. Does it already exist?\".format(attr_name), QgsMessageBar.CRITICAL)\r\n            layer.rollBack()\r\n\r\nedit_active_layer(\"new_string_attribute\", QVariant.String)\r\n<\/pre>\n<p><strong>3. CRIANDO UMA NOVA CAMADA VETORIAL<\/strong><\/p>\n<p>\u00c9 poss\u00edvel criar uma camada vetorial totalmente nova com o console Python. Abaixo, \u00e9 apresentada uma fun\u00e7\u00e3o muito simples (<strong>create_new_layer<\/strong>), mas espero que voc\u00ea possa imaginar as maneiras como ela pode ser ajustada.<\/p>\n<pre>\r\nfrom qgis.core import QgsField, QgsFields, QgsVectorLayer, QgsFeature, QgsGeometry, QgsPoint\r\nfrom PyQt4.QtCore import QVariant\r\n\r\ndef create_new_layer():\r\n    filename = \"\/path\/to\/your\/vector\/file.gpkg\"\r\n\r\n    fields = QgsFields()\r\n    fields.append(QgsField(\"attr1\", QVariant.String))\r\n    fields.append(QgsField(\"attr2\", QVariant.Int))\r\n\r\n    file = QgsVectorFileWriter(\r\n        filename,\r\n        \"UTF8\",\r\n        fields,\r\n        QGis.WKBPoint,\r\n        QgsCoordinateReferenceSystem(4326),\r\n        \"GPKG\"\r\n    )\r\n\r\n    layer = QgsVectorLayer(filename, filename.split(\"\/\")[-1], \"ogr\")\r\n    QgsMapLayerRegistry.instance().addMapLayer(layer)\r\n\r\n    if not layer.dataProvider().capabilities() & QgsVectorDataProvider.AddAttributes:\r\n        pass\r\n\r\n    feature = QgsFeature(layer.pendingFields())\r\n    feature.setGeometry(QgsGeometry().fromPoint(QgsPoint(0, 0)))\r\n    feature.setAttribute(\"attr1\", \"attr1\")\r\n    feature.setAttribute(\"attr2\", 2)\r\n\r\n    layer.startEditing()\r\n\r\n    if layer.addFeature(feature, True):\r\n        layer.commitChanges()\r\n    else:\r\n        layer.rollBack()\r\n        iface.messageBar().pushMessage(\"Feature addition failed.\", QgsMessageBar.CRITICAL)\r\n\r\ncreate_new_layer()\r\n<\/pre>\n<p>Esses foram apenas alguns exemplos do que pode ser feito com a API do QGIS e o console Python. <a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2018\/12\/04\/desenvolvimento-de-plugins-do-qgis-vizinho-mais-proximo-parte-3\/\" rel=\"noopener\" target=\"_blank\">No pr\u00f3ximo post<\/a>, vamos nos concentrar nas associa\u00e7\u00f5es espaciais dentro do QGIS.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como mencionado na parte anterior da s\u00e9rie, o console Python \u00e9 um ponto de entrada para a automa\u00e7\u00e3o do fluxo de trabalho GIS dentro do QGIS. Lembre-se de que existe um objeto iface representando a inst\u00e2ncia qgis.gui.QgisInterface dentro do console&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2018\/12\/03\/desenvolvimento-de-plugins-do-qgis-usando-o-console-parte-2\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":7774,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[79,260],"class_list":["post-7768","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-python","tag-qgis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/7768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=7768"}],"version-history":[{"count":7,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/7768\/revisions"}],"predecessor-version":[{"id":7820,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/7768\/revisions\/7820"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/7774"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=7768"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=7768"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=7768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}