การเปลี่ยนแหล่งข้อมูลของเลเยอร์ใน QGIS


18

มีวิธีการส่งไฟล์เชพไฟล์ไปยังเลเยอร์ไฟล์ใน QGIS เหมือนกับวิธีที่คุณทำในคุณสมบัติของเลเยอร์ ArcGIS หรือไม่? (เช่นไปที่คุณสมบัติเลเยอร์แท็บแหล่งข้อมูลจากนั้นกด'Set Dat Source'ปุ่ม)

ฉันได้รับคุณสมบัติทั้งหมดของเลเยอร์ใน QGIS และฉันไม่เห็นสิ่งนี้ทุกที่ ...

แก้ไข:ฉันได้รับความคิดเห็นที่อธิบายว่าคุณไม่สามารถทำเช่นนี้กับ shapefiles ได้ แต่ถ้าฉันเปลี่ยนชื่อของ shapefile แล้วเปิดไฟล์โครงการที่มีอยู่แล้วซึ่งมี shapefile นี้เป็นเลเยอร์ฉันจะได้ 'Handle บทสนทนาของเลเยอร์ที่ไม่ดีซึ่งทำให้ฉันสามารถนำทางและส่งเลเยอร์ไปยังรูปร่างใด ๆ ที่ฉันต้องการ ฉันคิดว่ามันแปลกที่คุณสามารถใช้ทรัพยากรในสถานการณ์นั้น แต่คุณไม่สามารถทำได้ด้วยตนเองผ่านกล่องโต้ตอบคุณสมบัติเลเยอร์

คำตอบ:


18

สิ่งนี้สามารถทำได้อย่างง่ายดายด้วยปลั๊กอิน:

changeDataSource

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

มันเพิ่มปุ่มเมื่อคุณคลิกขวาบนเลเยอร์เวกเตอร์ "เปลี่ยนแหล่งข้อมูลเวกเตอร์" ดังนั้นง่ายเหมือนอาร์ค


ฟังก์ชั่น gret ฉันหวังว่านั่นคือฟังก์ชั่นหลัก แต่!
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

ขอบคุณฉันดูที่ทำเช่นนี้ แต่ปัญหาที่ฉันมีคือผู้ใช้ของฉันไม่ใช่คน GIS พวกเขาแค่ต้องการให้โครงการดูข้อมูลบางอย่าง ฉันต้องการตั้งค่าไฟล์โครงการและตั้งค่าสัญลักษณ์และการติดฉลากทั้งหมดจากนั้นให้พวกเขากลับมาที่แหล่งข้อมูลเลเยอร์สำหรับไซต์อื่น วิธีนี้เกินความสามารถของเธอ ฉันคิดว่าฉันอาจจะสามารถเขียนสคริปต์ที่อนุญาตให้เธอใช้ปลั๊กอินเพื่ออัปเดตเลเยอร์
Mike

1
สิ่งที่เกี่ยวกับแบทช์ DOS ที่เพียงคัดลอกหนึ่งในไฟล์รูปร่างที่แตกต่างกันไปยังหุ่นจำลองที่อ้างถึงในไฟล์โครงการจากนั้นเริ่มไฟล์โครงการ ฉันไม่รู้ว่าจะเกิดอะไรขึ้นถ้าเลเยอร์ CRS หรือขอบเขตต่างกัน
AndreJ

1
น่าจะง่ายกว่าที่จะสอนพวกเขาถึงวิธีเพิ่มข้อมูลจัดรูปแบบและติดป้ายกำกับ คุณสามารถคัดลอกสไตล์และวางเพื่อให้ง่ายไม่ทราบเกี่ยวกับฉลาก เนื่องจากสิ่งที่คุณอธิบายไม่ใช่ GIS จริง ๆ หรือการแก้ไขจึงไม่ควรเป็นเรื่องยาก อีกทางเลือกหนึ่งอาจจะทำโปรแกรมแบบสแตนด์อโลนเพื่อแทนที่แหล่งที่มาเป็นไฟล์ qgs เป็นเพียงข้อความ
Antonio Locandro

3

ในไพ ธ อนมันเป็นไปได้ที่จะปรับเปลี่ยนแหล่งข้อมูลโดยตรงโดยใช้ QgsVectorLayer.writeLayerXML และ QgsVectorLayer.readLayerXML การแก้ไขเอกสาร DOM บน fly และโหลดเลเยอร์ใหม่จากตัวอย่างด้านล่าง

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

หากคุณทำงานกับ shapefiles ไม่ (เนื่องจากคุณสมบัติเฉพาะของรูปแบบ) หากคุณใช้เลเยอร์ PostGIS หรือ SpatiaLite เลเยอร์เวกเตอร์เดียว (ตาราง geometry_columns) สามารถเชื่อมต่อกับตารางแอตทริบิวต์หลายรายการและผกผัน (พร้อมกับคีย์ต่างประเทศหรือมุมมอง)

มันถูกนำมาใช้ในกำเนิดใน GRASS GIS หลายตารางสำหรับเลเยอร์เวกเตอร์หนึ่งและการเปลี่ยนแปลงแหล่งข้อมูล ( v.to.db

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.