Thay đổi nguồn dữ liệu của lớp trong QGIS


17

Có cách nào để tạo một shapefile cho một tệp lớp trong QGIS giống như cách bạn làm điều này trong các thuộc tính của một lớp ArcGIS không? (tức là Chuyển đến thuộc tính lớp, tab nguồn và sau đó chỉ cần nhấn 'Set Dat Source'nút)

Tôi đã có tất cả các thuộc tính lớp trong QGIS và tôi không thấy điều này ở bất cứ đâu ...

EDIT: Tôi đã nhận được ý kiến ​​giải thích rằng bạn không thể làm điều này với shapefile, nhưng nếu tôi thay đổi tên của shapefile và sau đó mở tệp dự án có sẵn shapefile này dưới dạng một lớp, tôi sẽ nhận được 'Xử lý Cuộc đối thoại của Lớp xấu, cho phép tôi điều hướng và cung cấp lại lớp cho bất kỳ shapefile nào tôi muốn. Tôi thấy thật kỳ lạ khi bạn có thể tài nguyên trong kịch bản đó, nhưng bạn không thể thực hiện thủ công thông qua hộp thoại thuộc tính lớp.

Câu trả lời:


18

Điều này bây giờ có thể được thực hiện dễ dàng với một plugin:

thay đổi nguồn

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

Nó thêm một nút khi bạn nhấp chuột phải vào lớp vectơ "Thay đổi nguồn dữ liệu vectơ", vì vậy dễ như Arc.


chức năng gret, tôi muốn đó là chức năng cốt lõi, mặc dù!
hilpers

giải pháp tốt! điều này sẽ đủ dễ dàng cho những người không sử dụng GIS.
ak112353

Thật không may, tính năng này sẽ không hoạt động nếu nguồn dữ liệu bạn muốn chuyển sang nằm trong Cơ sở dữ liệu địa lý tệp ESRI (thông qua Open FileGDB) vì loại dữ liệu đó không được liệt kê trong cửa sổ bật lên tiếp theo.
user25644

10

Hiện tại điều này là không thể, nhưng có một vé cho nó. Tuy nhiên, bạn có thể thay đổi nguồn dữ liệu trong .qss (tệp dự án) và mở lại dự án.

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

Thay đổi <datasource>dòng


4
Bạn có thể liên kết với vé để người khác sẽ biết nếu / khi nó hoàn thành?
RyanKDalton-OffTheGridMaps

Luôn luôn tốt khi bạn nói có một cái rồi không thể tìm thấy thứ đó :)
Nathan W

Cảm ơn, tôi đã xem xét làm theo cách này, nhưng vấn đề tôi gặp phải là người dùng của tôi không phải là người của GIS, họ chỉ cần dự án để xem một số dữ liệu. Tôi muốn thiết lập một tệp dự án và thiết lập tất cả các ký hiệu và ghi nhãn và sau đó chỉ cần nguồn lại lớp dữ liệu cho các trang web khác nhau. Phương pháp này nằm ngoài bộ kỹ năng của cô. Tôi nghĩ rằng tôi có thể viết một kịch bản cho phép cô ấy sử dụng một plugin để cập nhật các lớp.
Mike

1
Điều gì về một lô DOS chỉ đơn giản là sao chép một trong các shapefile khác nhau sang một hình nộm được tham chiếu trong tệp dự án, sau đó bắt đầu tệp dự án. Tôi không biết điều gì xảy ra nếu lớp CRS hoặc phạm vi khác nhau.
AndreJ

1
Có lẽ dễ dàng hơn để dạy họ cách thêm dữ liệu, tạo kiểu và nhãn. Bạn có thể sao chép kiểu và dán nó sao cho dễ, không biết về nhãn. Vì những gì bạn đang mô tả không thực sự là GIS hoặc chỉnh sửa nên nó không quá khó. Thay thế có thể là tạo một chương trình độc lập để thay thế nguồn dưới dạng tệp qss chỉ là văn bản
Antonio Locandro

3

trong python, có thể sửa đổi trực tiếp nguồn dữ liệu bằng cách sử dụng QssVectorLayer.writeLayerXML và QgsVectorLayer.readLayerXML sửa đổi tài liệu DOM trên lớp đang bay và tải lại như ví dụ bên dưới.

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)

Tính năng này đã được bao gồm trong plugin PickLayer cho phép thực hiện các hành động trên lớp và tính năng được nhấp


2

Từ bản phát hành 2.10 QGis Api bao gồm phương thức QssVectorLayer :: 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

Nếu bạn làm việc với shapefiles, không (do các đặc điểm cụ thể của định dạng). Nếu bạn sử dụng các lớp PostGIS hoặc SpatiaLite, một lớp vectơ duy nhất (bảng hình học_columns) có thể được kết nối với nhiều bảng thuộc tính và nghịch đảo (với khóa ngoài hoặc Chế độ xem).

Nó được triển khai tự nhiên trong GRASS GIS, nhiều bảng cho một lớp vectơ và thay đổi nguồn dữ liệu ( v.to.db

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.