Modifica dell'origine dati del livello in QGIS


18

Esiste un modo per generare un file di forma in un file di livello in QGIS in modo molto simile a come lo si fa nelle proprietà di un livello ArcGIS? (es. vai alle proprietà del livello, alla scheda sorgente e poi premi semplicemente il 'Set Dat Source'pulsante)

Sono stato in tutte le proprietà del layer in QGIS e non lo vedo da nessuna parte ...

EDIT: ho ricevuto commenti che spiegano che non puoi farlo con gli shapefile, ma se dovessi cambiare il nome di uno shapefile e quindi aprire un file di progetto preesistente che contiene questo shapefile come layer, otterrò il comando 'Handle Il dialogo Bad Layers, che mi permette di navigare e ri-dare il layer a qualsiasi shapefile che voglio. Trovo strano che tu possa fare risorse in quello scenario, ma non puoi farlo manualmente attraverso la finestra di dialogo delle proprietà del livello.

Risposte:


18

Questo ora può essere fatto facilmente con un plugin:

changeDataSource

https://geogear.wordpress.com/2015/09/30/changedatasource-plugin-release-1-0/

Aggiunge un pulsante quando si fa clic con il pulsante destro del mouse su un livello vettoriale "Modifica origine dati vettoriale", quindi facile come Arc.


gret funzionalità, vorrei che fosse la funzionalità di base, però!
Hilpers,

buona soluzione! questo sarebbe abbastanza facile da usare per persone non GIS.
ak112358

Sfortunatamente questa funzione non funzionerà se l'origine dati su cui si desidera passare si trova in un geodatabase di file ESRI (tramite Open FileGDB) in quanto tale tipo di dati non è elencato nella finestra pop-up successiva.
user25644,

10

Attualmente questo non è possibile, ma c'è un biglietto per questo. È comunque possibile modificare l'origine dati nel file .qgs (file di progetto) e riaprire il progetto.

<projectlayers layercount="1">
    <maplayer minimumScale="-4.65661e-10" maximumScale="1e+08" minLabelScale="0" maxLabelScale="1e+08" geometry="Point" type="vector" hasScaleBasedVisibilityFlag="0" scaleBasedLabelVisibilityFlag="0">
        <id>graduated_classes20130603233806207</id>
        <datasource>../Downloads/Grauated_classes_test_sample/graduated_classes.shp</datasource>
        <title></title>
        <abstract></abstract>

Cambia la <datasource>linea


4
Puoi collegarti al biglietto in modo che altri possano sapere se / quando è completo?
RyanKDalton-OffTheGridMaps,

Sempre buono quando dici che ce n'è uno, quindi non riesci a trovare la cosa :)
Nathan W,

Grazie, ho cercato di farlo in questo modo, ma il problema che ho è che i miei utenti non sono persone GIS, hanno solo bisogno del progetto per visualizzare alcuni dati. Volevo impostare un file di progetto e impostare tutta la simbologia e l'etichettatura e quindi semplicemente reintegrare il livello dati per siti diversi. Questo metodo va oltre il suo set di abilità. Sto pensando che potrei essere in grado di scrivere uno script che le consenta di utilizzare un plugin per aggiornare i livelli.
Mike,

1
Che dire di un batch DOS che copia semplicemente uno dei diversi shapefile in uno fittizio a cui viene fatto riferimento nel file di progetto, quindi avvia il file di progetto. Non so cosa succede se il layer CRS o l'estensione sono diversi.
AndreJ,

1
Probabilmente più facile insegnare loro come aggiungere i dati, modellarli ed etichettarli. Puoi copiare lo stile e incollarlo in modo che sia facile, non conosci le etichette. Dal momento che ciò che stai descrivendo non è GIS o modifica, non dovrebbe essere così difficile. Alternativa potrebbe essere quella di creare un programma autonomo per sostituire l'origine in quanto un file qgs è solo testo
Antonio Locandro,

3

in python è possibile modificare direttamente l'origine dati usando QgsVectorLayer.writeLayerXML e QgsVectorLayer.readLayerXML modificando al volo il documento DOM e ricaricando il layer come nell'esempio seguente.

from PyQt4.QtXml import *
from qgis.core import *
from PyQt4.QtXml import *

layer = self.iface.legendInterface().currentLayer()
newDatasource = "NEW DATASOURCE STRING" # get datasource from layer properties general     tab
newDatasourceProvider = "ogr" # possible values: (ogr, )

# read layer DOM definition
XMLDocument = QDomDocument("style")
XMLMapLayers = QDomElement()
XMLMapLayers = XMLDocument.createElement("maplayers")
XMLMapLayer = QDomElement()
XMLMapLayer = XMLDocument.createElement("maplayer")
layer.writeLayerXML(XMLMapLayer,XMLDocument)

# modify DOM element with new layer reference
XMLMapLayer.firstChildElement("datasource").firstChild().setNodeValue(newDatasource)
XMLMapLayer.firstChildElement("provider").firstChild().setNodeValue(newDatasourceProvider)
XMLMapLayers.appendChild(XMLMapLayer)
XMLDocument.appendChild(XMLMapLayers)

# reload layer definition
self.layer.readLayerXML(XMLMapLayer)
self.layer.reload()

# apply to canvas and legend
self.iface.actionDraw().trigger()
self.iface.legendInterface().refreshLayerSymbology(self.layer)

La funzione è stata inclusa nel plug- in PickLayer che consente di eseguire azioni sul livello e sulla funzione cliccati


2

Dalla versione 2.10 QGis Api include il metodo QgsVectorLayer :: setDataSource :

void QgsVectorLayer::setDataSource  (   QString     dataSource,
        QString     baseName,
        QString     provider,
        bool    loadDefaultStyleFlag = false 
    )       

Update the data source of the layer.

The layer's renderer and legend will be preserved only if the geometry type of the new data source matches the current geometry type of the layer.

Parameters
    dataSource  new layer data source
    baseName    base name of the layer
    provider    provider string
    loadDefaultStyleFlag    set to true to reset the layer's style to the default for the data source 

1

Se lavori con shapefile, no (a causa delle caratteristiche specifiche del formato). Se utilizzi i livelli PostGIS o SpatiaLite, un singolo livello vettoriale (tabella geometry_columns) può essere collegato a più tabelle di attributi e invertito (con chiavi esterne o viste).

È implementato nativamente in GRASS GIS, più tabelle per un livello vettoriale e modifica dell'origine dati ( v.to.db

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.