Zmiana źródła danych warstwy w QGIS

18

Czy istnieje sposób na źródło pliku kształtu do pliku warstwy w QGIS, podobnie jak to robisz we właściwościach warstwy ArcGIS? (tzn. Przejdź do właściwości warstwy, zakładki źródła, a następnie po prostu naciśnij 'Set Dat Source'przycisk)

Sprawdziłem wszystkie właściwości warstw w QGIS i nigdzie tego nie widzę ...

EDYCJA: Otrzymałem komentarze wyjaśniające, że nie możesz tego zrobić z plikami kształtów, ale jeśli miałbym zmienić nazwę pliku kształtu, a następnie otworzyć wcześniej istniejący plik projektu, który zawiera ten plik kształtu jako warstwę, otrzymam „Uchwyt” Dialog Bad Layers, który pozwala mi nawigować i ponownie pobierać warstwę do dowolnego pliku kształtu, który chcę. Wydaje mi się dziwne, że możesz korzystać z zasobów w tym scenariuszu, ale nie możesz tego zrobić ręcznie za pomocą okna dialogowego właściwości warstwy.

Mikrofon
źródło

Odpowiedzi:

18

Można to teraz łatwo zrobić za pomocą wtyczki:

changeDataSource

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

Dodaje przycisk po kliknięciu prawym przyciskiem myszy warstwy wektorowej „Zmień źródło danych wektorowych”, tak proste jak Arc.

HeikkiVesanto
źródło
żałosna funkcjonalność, szkoda, że ​​nie była to podstawowa funkcjonalność!
hilpers,
dobre rozwiązanie! byłoby to dość łatwe dla osób spoza GIS.
ak112358
Niestety ta funkcja nie będzie działać, jeśli źródło danych, na które chcesz się przełączyć, znajduje się w geobazie danych pliku ESRI (poprzez Open FileGDB), ponieważ ten typ danych nie jest wymieniony w kolejnym wyskakującym oknie.
user25644
10

Obecnie nie jest to możliwe, ale jest na to bilet. Możesz jednak zmienić źródło danych w pliku .qgs (plik projektu) i ponownie otworzyć projekt.

<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>

Zmień <datasource>linię

Nathan W.
źródło
4
Czy możesz połączyć się z biletem, aby inni wiedzieli, czy / kiedy będzie kompletny?
RyanKDalton-OffTheGridMaps
Zawsze dobrze, gdy mówisz, że jest, a potem nie możesz tego znaleźć :)
Nathan W
Dzięki, patrzyłem na robienie tego w ten sposób, ale mam problem, że moi użytkownicy nie są ludźmi GIS, po prostu potrzebują projektu, aby wyświetlić niektóre dane. Chciałem skonfigurować plik projektu i ustawić całą symbolikę i etykietowanie, a następnie po prostu ponownie zaimportować warstwę danych dla różnych witryn. Ta metoda przekracza jej umiejętności. Myślę, że być może uda mi się napisać skrypt, który pozwoli jej użyć wtyczki do aktualizacji warstw.
Mike
1
Co z pakietem DOS, który po prostu kopiuje jeden z różnych plików kształtów do fikcyjnego pliku, do którego odwołuje się plik projektu, a następnie uruchamia plik projektu. Nie wiem, co się stanie, jeśli warstwy CRS lub zakresy będą się różnić.
AndreJ
1
Prawdopodobnie łatwiej nauczyć ich, jak dodawać dane, stylizować je i oznaczać. Możesz skopiować styl i wkleić go, aby było to łatwe, nie wiem o etykietach. Ponieważ to, co opisujesz, nie jest tak naprawdę GIS ani edytowaniem, nie powinno to być takie trudne. Alternatywą może być stworzenie samodzielnego programu zastępującego źródło, ponieważ plik qgs to tylko tekst
Antonio Locandro
3

w Pythonie można bezpośrednio modyfikować źródło danych za pomocą QgsVectorLayer.writeLayerXML i QgsVectorLayer.readLayerXML modyfikując dokument DOM w locie i ponownie ładując warstwę, jak w przykładzie poniżej.

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)

Funkcja została zawarta we wtyczce PickLayer, która pozwala wykonywać działania na klikniętej warstwie i funkcji

Enrico Ferreguti
źródło
2

Od wydania 2.10 QGis Api zawiera metodę 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 
Enrico Ferreguti
źródło
1

Jeśli pracujesz z plikami kształtów, nie (ze względu na specyficzne cechy formatu). Jeśli używasz warstw PostGIS lub SpatiaLite, jedną warstwę wektorową (tabela geometria_kolumny) można połączyć z wieloma tabelami atrybutów i odwrotnie (z kluczami obcymi lub widokami).

Jest zaimplementowany natywnie w GRASS GIS, wielu tabelach dla jednej warstwy wektorowej i zmieniającym się źródle danych ( v.to.db

gen
źródło