Изменение источника данных уровня в QGIS

18

Есть ли способ добавить шейп-файл в файл слоя в QGIS, так же, как вы делаете это в свойствах слоя ArcGIS? (то есть перейдите к свойствам слоя, вкладке источника, а затем просто нажмите 'Set Dat Source'кнопку)

Я изучил свойства слоя в QGIS и нигде не вижу этого ...

РЕДАКТИРОВАТЬ: я получил комментарии, объясняющие, что вы не можете сделать это с шейп-файлами, но если бы я изменил имя шейп-файла, а затем открыл уже существующий файл проекта, который содержит этот шейп-файл в качестве слоя, я получу «дескриптор» Диалог «Bad Layers», который позволяет мне перемещаться и повторно создавать источники для любого шейп-файла, который я хочу. Мне кажется странным, что вы можете использовать ресурсы в этом сценарии, но вы не можете сделать это вручную через диалоговое окно свойств слоя.

Майк
источник

Ответы:

18

Теперь это можно легко сделать с помощью плагина:

changeDataSource

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

Она добавляет кнопку, когда вы щелкаете правой кнопкой мыши по слою вектора «Изменить источник данных вектора», так же просто, как Arc.

HeikkiVesanto
источник
Впрочем, я хотел бы, чтобы это была основная функциональность!
hilpers
хорошее решение! это было бы достаточно просто для использования людьми, не являющимися ГИС.
ak112358
К сожалению, эта функция не будет работать, если источник данных, на который вы хотите переключиться, находится в файловой базе геоданных ESRI (через Open FileGDB), поскольку этот тип данных не указан в следующем всплывающем окне.
user25644
10

В настоящее время это невозможно, но на это есть билет. Однако вы можете изменить источник данных в .qgs (файл проекта) и снова открыть проект.

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

Изменить <datasource>линию

Натан У
источник
4
Можете ли вы дать ссылку на билет, чтобы другие знали, если / когда он будет завершен?
RyanKDalton-OffTheGridMaps
Всегда хорошо, когда ты говоришь, что есть такой, тогда не можешь найти вещь :)
Натан W
Спасибо, я смотрел на это так, но проблема в том, что мои пользователи не люди ГИС, им просто нужен проект для просмотра некоторых данных. Я хотел настроить файл проекта и установить все символы и метки, а затем просто повторно создать источник данных для разных сайтов. Этот метод выходит за рамки ее навыков. Я думаю, что смогу написать сценарий, который позволит ей использовать плагин для обновления слоев.
Майк
1
Как насчет пакета DOS, который просто копирует один из различных шейп-файлов в фиктивный файл, на который есть ссылка в файле проекта, а затем запускает файл проекта. Я не знаю, что произойдет, если уровень CRS или экстенты различны.
AndreJ
1
Вероятно, проще научить их, как добавлять данные, стилизовать их и маркировать. Вы можете скопировать стиль и вставить его так, чтобы это было легко, не знайте о ярлыках. Поскольку то, что вы описываете, на самом деле не ГИС или редактирование, это не должно быть таким сложным. Альтернативой может быть создание автономной программы для замены исходного кода, поскольку файл qgs представляет собой просто текст
Антонио Локандро
3

в python можно напрямую изменять источник данных, используя QgsVectorLayer.writeLayerXML и QgsVectorLayer.readLayerXML, модифицируя документ DOM на лету и перезагружая слой, как в примере ниже.

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)

В плагин PickLayer включена функция , позволяющая выполнять действия с выбранным слоем и объектом

Энрико Феррегути
источник
2

Начиная с версии 2.10 QGis Api включает метод 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

Если вы работаете с шейп-файлами, нет (из-за специфических характеристик формата). Если вы используете слои PostGIS или SpatiaLite, один векторный слой (таблица geometry_columns) может быть связан с несколькими таблицами атрибутов и обратно (с внешними ключами или представлениями).

Он реализован изначально в GRASS GIS, в нескольких таблицах для одного векторного слоя и при изменении источника данных ( v.to.db

ген
источник