Tham gia dữ liệu từ Excel vào bảng thuộc tính trong QGIS mà không tạo các bản sao?


15

Tôi có một bảng thuộc tính với hai trường trống trong QGIS.

Ví dụ 1

Tôi muốn nhập cơ sở dữ liệu excel để điền vào các trường trống của mình trong QGIS. Tệp excel của tôi khớp với các cột trong bảng thuộc tính QGIS của tôi.

Ví dụ_2

Tôi có thể tham gia excel (.CSV) đúng cách vào shapefile của mình. Tuy nhiên, quá trình, thay vì điền vào các trường trống như tôi muốn, đã tạo các bản sao. Với sự giúp đỡ của «Trình quản lý bảng» tôi có thể khắc phục tình huống này, nhưng nó đòi hỏi rất nhiều thời gian. Tôi đang tìm kiếm một cách hiệu quả hơn để tham gia dữ liệu excel của tôi.

Ví dụ_3

Làm cách nào tôi có thể tham gia tệp excel của mình vào bảng thuộc tính mà không tạo các bản sao?


3
Hãy xem hướng dẫn này: Thực hiện tham gia bảng
ArMoraer

Câu trả lời:


13

Tôi sẽ làm những điều sau đây để làm cho cuộc sống dễ dàng hơn:

Trước khi bạn làm điều này, tạo một bản sao lưu của shapefile của bạn.

  1. Trong shapefile của bạn, đi đến thuộc tính / trường lớp và bật chế độ chỉnh sửa.
  2. chọn tất cả các trường trừ trường ID
  3. Xóa tất cả các trường ngoại trừ Trường ID
  4. thêm tệp csv của bạn dưới dạng một lớp trong QGIS (Menu chính / Lớp / Thêm lớp / Thêm lớp văn bản được phân tách) nhập mô tả hình ảnh ở đây(chọn không có hình học)
  5. trong shapefile của bạn, chọn thuộc tính / tham gia và chọn cả hai trường ID cho nguồn và đích. Như được mô tả trong câu trả lời khác cho câu hỏi này.
  6. Lưu Shapefile sửa đổi của bạn.

nhập mô tả hình ảnh ở đây

đây là tab Trường tôi đang đề cập đến

nhập mô tả hình ảnh ở đây

Đừng quên chuyển đổi chỉnh sửa trước và sau khi xóa trường không cần thiết


13

Bạn sẽ muốn tham gia tệp excel vào shapefile. Bạn sẽ tham gia chúng trên một thuộc tính chung và kết quả sẽ là một lớp được nối trong đó mỗi bản ghi chứa các thuộc tính của cả tệp shapefile và tệp excel.

Ok trước tiên bạn tải tệp excel của bạn và vector của bạn sau đó vào các lớp. Tôi đã sử dụng một số dữ liệu thử nghiệm tôi đã thực hiện nhưng thiết lập của bạn sẽ trông giống như bên dưới. nhập mô tả hình ảnh ở đây

Bây giờ, nhấp chuột phải vào lớp (trong bảng điều khiển lớp) và chọn thuộc tính, sau đó chọn tham gia. Đầu tiên nhấn vào dấu + màu xanh lá cây ở phía dưới bên trái (Mũi tên lớn màu đỏ trong hình bên dưới) và nó sẽ hiển thị menu Thêm Vector Tham gia mới (như bên dưới) Ở đây lớp tham gia của bạn sẽ là tệp excel (vì vậy hãy chọn tệp excel thích hợp & sheet) trường tham gia là trường trong tệp excel chứa thuộc tính chung cho shapefile. Trường đích là trường khớp trong shapefile. (trong trường hợp của tôi, cả hai trường chung đều được đặt tên là đơn vị, nhưng nếu trường được gọi là UNIT_ trong shapefile, tôi sẽ sử dụng nó thay vì UNIT cho trường mục tiêu của mình)
nhập mô tả hình ảnh ở đây Có một vài tùy chọn khác mà bạn có thể gặp rắc rối khi tham gia, như nếu bạn chỉ muốn xem một số trường nhất định, v.v ... dù sao thì bây giờ chúng được tham gia và nếu bạn quay lại và xem các thuộc tính của shapefile bạn sẽ thấy bây giờ nó có các thuộc tính tương ứng của tệp excel như bên dưới.

nhập mô tả hình ảnh ở đây

Dưới đây là một vài hướng dẫn hữu ích để chỉ cho bạn từng bước cách thực hiện:

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatial Dùts.com/2012/03/USE-tabular-data-in-qgis.html

Làm cách nào để tham gia các bảng bên ngoài với bảng thuộc tính của shapefile trong QGIS?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

và hướng dẫn ArMoraer đã đề cập trong các ý kiến.


Tôi đã xem hướng dẫn mapbox.com/tilemill/docs/guides/joining-data wich, nhân tiện, rất hữu ích. Tuy nhiên, tôi vẫn không thể tham gia tệp DBF vào shapefile của mình. Nó làm tôi ngạc nhiên vì cả hai cấu trúc bảng của tôi hoàn toàn khớp nhau. Tôi dường như hiểu sai về «Tham gia trường» và «Trường mục tiêu». Bạn có thể thêm chi tiết xin vui lòng?
Laurent Robitaille-Lainlie

1
@Laurent Robitaille-Lainlie Tôi đã cập nhật bài viết của mình với hướng dẫn từng bước nhiều hơn. Tôi đã tham gia một tệp excel thử nghiệm vào một shapefile đa giác chỉ để đảm bảo các bước của tôi là chính xác.
ed.hank

Tôi đã thành công khi tham gia tập tin excel của mình vào QGIS. Tôi quan sát rằng tùy chọn «tham gia» thêm một trường mới trong bảng thuộc tính. Sửa lỗi cho tôi nếu tôi sai, nhưng dường như không thể thêm dữ liệu từ tệp excel của tôi vào trường trống trong bảng thuộc tính của tôi.
Laurent Robitaille-Lainlie

1
Nếu bạn có một trường trống, thì bạn sử dụng máy tính trường để điền từ trường mới tham gia vào trường có trong bảng của bạn.
ed.hank

10

Chỉ cần thêm phương thức khác, bạn có thể thiết lập macro Project khi được tải:

  1. Tự động tham gia shapefile của bạn vào csv của bạn
  2. Cập nhật IP1IP2các lĩnh vực
  3. Loại bỏ các trường đã tham gia chỉ để lại các trường của shapefile (tức là không có dulplicates)

Đầu tiên, tạo một dự án nếu bạn chưa thực hiện và sau đó vào thanh công cụ:

Dự án> Thuộc tính dự án ...> Macro

Sau đó, sử dụng mã sau đây trong def openProject():hàm và nhập tên của các lớp của bạn và các trường bạn muốn tham gia. Tôi đã sử dụng "Ví dụ" và "bảng tính" cho tệp shapefile và csv của mình tương ứng với trường ID:

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

Macro dự án

Đảm bảo rằng các lớp không được nối, lưu dự ánbật macro bằng cách vào thanh công cụ:

Cài đặt> Chung> Bật macro


Bây giờ khi bạn đóng dự án và chỉnh sửa tệp csv, lần sau khi bạn tải dự án, các trường sẽ tự động được cập nhật:

Chỉnh sửa tập tin csv

Các kết quả


7

Đề xuất của tôi là sử dụng LibreOffice / Open Office mã nguồn mở để chỉnh sửa tệp Excel của bạn và tạo tệp .dbf. Tôi đã chuẩn bị bài kiểm tra cho bạn. Bài kiểm tra - liên kết

  1. Mở tệp trong Libre Office / Open Office.
  2. Dán vào dữ liệu bảng "Excel" từ tệp excel của bạn.
  3. Dán vào dữ liệu trang tính "DBF" từ tệp .dbf của bạn (chỉ dán ID, X, Y) (giá trị IP1, IP2 sẽ được thêm tự động).
  4. Lưu dưới dạng tệp name.dbf (trong đó tên giống như tên tệp hình dạng của bạn).

Bảng kết quả không trùng lặp trong QGIS: nhập mô tả hình ảnh ở đây


5

Tại sao các trường trống ở đó để bắt đầu? Bạn có thể bắt đầu mà không có các trường trống và chỉ sử dụng hai cột được tạo trong phép nối không? Tôi nghĩ rằng đây là cách tiếp cận đơn giản nhất. Hoặc là hoặc tìm một công cụ tương tự như công cụ "Tải" trong ArcGIS.

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htmlm

Nếu bạn không sử dụng cơ sở dữ liệu địa lý, tôi thực sự khuyên bạn nên điều này.


Tôi không sử dụng cơ sở dữ liệu địa lý. Trong thực tế, tôi không phải là familliar với nó.
Laurent Robitaille-Lainlie 28/03/2016

1
@ LaurentRobitaille-Lainlie Tôi khuyên bạn nên tạo một cơ sở dữ liệu địa lý tệp mới, sau đó là một lớp tính năng mới trong đó và sử dụng điều này để lưu trữ dữ liệu của bạn. Tôi cũng khuyên bạn nên thực hiện một số nghiên cứu ngắn gọn về cơ sở dữ liệu địa lý và các lớp tính năng và lý do tại sao chúng tôi sử dụng chúng, những gì chúng cung cấp ngoài shapefiles.
Stella

4

Tôi không biết có cách nào trực tiếp để tham gia mà không trùng lặp vì hỗ trợ tệp .shp bằng cách quy kết trong .DBF (tệp cơ sở dữ liệu). DBF này có khai báo kiểu cột như số nguyên, số thực, chuỗi, v.v với chi tiết về độ dài và độ chính xác của nó. Tệp CSV chỉ có cột bình thường mà không có bất kỳ loại nào được khai báo. Tôi không biết tập tin của bạn lớn như thế nào. Đối với tôi, tôi sẽ giữ các Trường trùng lặp và sau đó sử dụng công cụ tính toán trường với công thức chung:

Trường gốc_x = Trường trùng lặp_x

Sau đó xóa tất cả các trường trùng lặp đó (thông qua QGIS hoặc chương trình cơ sở dữ liệu)


3

Tôi tin rằng cách dễ nhất để khắc phục điều này sẽ chỉ đơn giản là xóa hai cột được đề cập trong bảng QGIS trước khi tham gia. Sau đó, khi bạn tham gia shapefile, hai cột bạn muốn sẽ không trùng lặp và sẽ giữ tên cột ban đầu của chúng.

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.