Зміна джерела даних шару в QGIS


18

Чи є спосіб створити файл форми у файл шару в QGIS, як, як це зробити у властивостях шару ArcGIS? (тобто перейдіть до властивостей шару, вкладка джерела, а потім просто натисніть 'Set Dat Source'кнопку)

Я був у всіх властивостях шару в QGIS, і цього я ніде не бачу ...

EDIT: Я отримав коментарі, в яких пояснюється, що ви не можете це зробити за допомогою файлів shapefiles, але якщо я повинен змінити ім'я формфайлу, а потім відкрити вже існуючий файл проекту, який містить цей файл файлу як шар, я отримаю 'Handle Діалог поганих шарів, який дозволяє мені переходити і відновлювати шар до будь-якого файлу форми, який я хочу. Мені здається дивним, що ви можете використати ресурси в цьому сценарії, але ви не можете це зробити вручну через діалогове вікно властивостей шару.

Відповіді:


18

Тепер це легко зробити за допомогою плагіна:

changeDataSource

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

Він додає кнопку, коли клацніть правою кнопкою миші на векторному шарі "Змінити векторний джерело даних", так само просто, як і Дуга.


gret функціональність, я хотів би, щоб це була основна функціональність!
hilpers

гарне рішення! це було б досить просто для людей, які не є ГІС.
ak112358

На жаль, ця функція не працюватиме, якщо джерело даних, на який потрібно перейти, знаходиться у базі даних геоданих файлів ESRI (через Open FileGDB), оскільки цей тип даних не вказаний у наступному спливаючому вікні.
користувач25644

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

Завжди добре, коли ти кажеш, що є, то не можеш знайти речі :)
Nathan W

Дякую, я дивився на це так, але моя проблема полягає в тому, що мої користувачі не люди ГІС, їм просто потрібен проект, щоб переглянути деякі дані. Я хотів створити файл проекту та встановити всю символіку та маркування, а потім просто перезавантажити рівень даних для різних сайтів. Цей метод виходить за межі її набору навичок. Я думаю, що я можу написати сценарій, який дозволяє їй використовувати плагін для оновлення шарів.
Майк

1
Як щодо партії DOS, яка просто копіює один з різних файлів форм на манекен, на який посилається у файлі проекту, а потім запустіть файл проекту. Я не знаю, що станеться, якщо CRS шару або розширення відрізняються.
АНДРІЙ

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, один векторний шар (таблиця геометрії стовпців) може бути підключений до декількох таблиць атрибутів, і зворотний (із сторонніми ключами або представленнями).

Він реалізований на самоті в GRASS GIS, декількох таблицях для одного векторного шару та зміні джерела даних ( v.to.db

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.