QGIS में परत का डेटा स्रोत बदलना


18

क्या QGIS में एक लेयर फाइल के लिए शेपफाइल को सोर्स करने का एक तरीका है जैसे कि आप आर्कगेज लेयर के गुणों में यह कैसे करते हैं? (यानी परत गुण, स्रोत टैब पर जाएं और फिर 'Set Dat Source'बटन दबाएं)

मैं QGIS में परत के गुणों से अधिक रहा हूं और मुझे यह कहीं भी नहीं दिखता ...

संपादित करें: मैंने यह समझाते हुए टिप्पणियां प्राप्त की हैं कि आप इसे आकार-प्रकार के साथ नहीं कर सकते हैं, लेकिन अगर मुझे एक आकार-प्रकार का नाम बदलना है और फिर एक पहले से मौजूद परियोजना फ़ाइल को खोलना है, जिसमें इस आकृति-परत के रूप में परत है, तो मुझे 'हैंडल' मिलेगा। बैड लेयर्स संवाद, जो मुझे उस परत को नेविगेट करने और पुन: स्रोत करने की अनुमति देता है जिसे मैं चाहता हूं। मुझे यह अजीब लगता है कि आप उस परिदृश्य में संसाधन कर सकते हैं, लेकिन आप इसे परत गुण संवाद बॉक्स के माध्यम से मैन्युअल रूप से नहीं कर सकते।

जवाबों:


18

यह अब एक प्लगइन के साथ आसानी से किया जा सकता है:

changeDataSource

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

यह एक बटन जोड़ता है जब आप वेक्टर लेयर "चेंज वेक्टर डेटासोर्स" पर राइट क्लिक करते हैं, तो आर्क जितना आसान होता है।


कार्यशीलता, मैं चाहता हूँ कि मूल कार्यक्षमता था, हालांकि!
hilpers

अच्छा समाधान! यह गैर-जीआईएस लोगों के लिए उपयोग करने के लिए काफी आसान होगा।
ak112358

दुर्भाग्य से यह सुविधा काम नहीं करेगी यदि आप जिस डेटा स्रोत को स्विच करना चाहते हैं वह ESRI फाइल जियोडैटेबेस (ओपन फाइल जीबीडीबी के माध्यम से) में है क्योंकि डेटा प्रकार बाद के पॉप अप विंडो में सूचीबद्ध नहीं है।
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
क्या आप टिकट से लिंक कर सकते हैं ताकि दूसरों को पता चल जाए कि यह कब पूरा हुआ है?
रयानकैल्टन

हमेशा अच्छा होता है जब आप कहते हैं कि कोई एक चीज़ नहीं है :)
नाथन डब्ल्यू

धन्यवाद, मैंने इसे इस तरह से देखा, लेकिन मेरे पास समस्या यह है कि मेरे उपयोगकर्ता जीआईएस लोग नहीं हैं, उन्हें बस कुछ डेटा देखने के लिए प्रोजेक्ट की आवश्यकता है। मैं एक प्रोजेक्ट फ़ाइल स्थापित करना चाहता था और सभी सिम्बॉलॉजी और लेबलिंग सेट करना और फिर अलग-अलग साइटों पर डेटा लेयर को री-सोर्स करना था। यह तरीका उसके कौशल सेट से परे है। मुझे लगता है कि मैं एक स्क्रिप्ट लिखने में सक्षम हो सकता हूं जो उसे परतों को अपडेट करने के लिए एक प्लगइन का उपयोग करने की अनुमति देता है।
माइक

1
DOS बैच के बारे में क्या है जो प्रोजेक्ट फ़ाइल में संदर्भित विभिन्न डमी में से किसी एक को कॉपी करता है, फिर प्रोजेक्ट फ़ाइल को प्रारंभ करें। मुझे नहीं पता कि क्या होता है अगर परत CRS या extents अलग हैं।
आंद्रे जे

1
संभवतः उन्हें सिखाना आसान है कि डेटा कैसे जोड़ें, इसे स्टाइल करें और लेबल करें। आप शैली को कॉपी कर सकते हैं और इसे पेस्ट कर सकते हैं ताकि यह आसान हो, लेबल के बारे में पता न हो। चूँकि आप वास्तव में जीआईएस का संपादन नहीं कर रहे हैं या इसे संपादित करना मुश्किल नहीं होना चाहिए। वैकल्पिक शायद स्रोत को बदलने के लिए एक स्टैंडअलोन प्रोग्राम बनाने के लिए एक क्यूजीएस फ़ाइल के रूप में सिर्फ पाठ है
एंटोनियो लोकेन्ड्रो

3

अजगर में सीधे 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)

फीचर को पिकलेयर प्लगइन में शामिल किया गया है जो क्लिक की गई परत और सुविधा पर कार्रवाई करने की अनुमति देता है


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) के लिए कई टेबल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.