Czy łączysz dane z Excela z tabelą atrybutów w QGIS bez tworzenia duplikatów?

15

Mam tabelę atrybutów z dwoma pustymi polami w QGIS.

Przykład 1

Chcę zaimportować bazę danych programu Excel, aby wypełnić moje puste pola w QGIS. Mój plik programu Excel pasuje do kolumn w mojej tabeli atrybutów QGIS.

Przykład_2

Jestem w stanie poprawnie dołączyć mój program Excel (.CSV) do mojego pliku kształtu. Jednak proces, zamiast wypełniać puste pola, jak chciałbym, stworzył duplikaty. Za pomocą «Table Managera» jestem w stanie poprawić sytuację, ale wymaga to dużo czasu. Szukam bardziej efektywnego sposobu dołączenia do moich danych programu Excel.

Przykład_3

Jak mogę dołączyć mój plik Excel do mojej tabeli atrybutów bez tworzenia duplikatów?

Laurent Robitaille-Lainesse
źródło
3
Rzuć

Odpowiedzi:

13

Zrobiłbym następujące rzeczy, aby ułatwić życie:

Zanim to zrobisz, wykonaj kopię zapasową pliku kształtu.

  1. W swoim pliku kształtu przejdź do właściwości / pól warstwy i włącz tryb edycji.
  2. wybierz wszystkie pola oprócz pola identyfikatora
  3. Usuń wszystkie pola oprócz pola identyfikatora
  4. dodaj plik csv jako warstwę w QGIS (Menu główne / Warstwa / Dodaj warstwę / Dodaj warstwę tekstową z ogranicznikami) wprowadź opis zdjęcia tutaj(wybierz brak geometrii)
  5. w swoim pliku kształtu wybierz właściwości / złączenia i wybierz oba pola ID dla źródła i celu. Jak opisano w innej odpowiedzi na to pytanie.
  6. Zapisz zmodyfikowany plik kształtu.

wprowadź opis zdjęcia tutaj

jest to zakładka Pole, o której mowa

wprowadź opis zdjęcia tutaj

Nie zapomnij przełączać edycji przed i po usunięciu niepotrzebnego pola

RutgerH
źródło
13

Będziesz chciał dołączyć plik programu Excel do pliku kształtu. Połączysz je wspólnym atrybutem, a wynikiem będzie połączona warstwa, w której każdy rekord będzie zawierał atrybuty pliku shapefile i pliku excel.

Ok, najpierw ładujesz plik Excel, a później wektor do warstw. Użyłem niektórych danych testowych, które wykonałem, ale twoja konfiguracja powinna wyglądać podobnie do poniższej. wprowadź opis zdjęcia tutaj

Teraz kliknij prawym przyciskiem myszy warstwę (w panelu warstw) i wybierz właściwości, a następnie wybierz dołącz. Najpierw naciśnij zielony + znak w lewym dolnym rogu (duża czerwona strzałka na obrazku poniżej), a wyświetli się nowe menu Dodaj wektor dołączania (jak poniżej) Tutaj twoja warstwa łączenia będzie plikiem programu Excel (więc wybierz odpowiedni plik programu Excel i arkusz) pole łączenia to pole w pliku programu Excel, które zawiera wspólny atrybut pliku kształtu. Pole docelowe to pasujące pole w pliku kształtu. (w moim przypadku oba wspólne pola zostały nazwane jednostkami, ale jeśli pole to nazywało się UNIT_, użyłbym tego zamiast UNIT dla mojego pola docelowego)
wprowadź opis zdjęcia tutaj Istnieje kilka innych opcji, z którymi możesz zepsuć się podczas łączenia, na przykład jeśli chcesz zobaczyć tylko niektóre pola itp., Tak czy inaczej, teraz są one połączone, a jeśli wrócisz i spojrzysz na atrybuty pliku kształtu, zobaczysz ma teraz odpowiednie atrybuty pliku programu Excel, jak poniżej.

wprowadź opis zdjęcia tutaj

Oto kilka przydatnych poradników, które krok po kroku pokażą Ci, jak to zrobić:

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

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

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

Jak dołączyć tabele zewnętrzne za pomocą tabeli atrybutów shapefile w QGIS?

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

oraz samouczek ArMoraer wspomniany w komentarzach.

ed. dziękuję
źródło
Spojrzałem na samouczek mapbox.com/tilemill/docs/guides/joining-data, który, nawiasem mówiąc, był bardzo przydatny. Jednak nadal nie mogę dołączyć mojego pliku DBF do mojego pliku kształtu. Zaskakuje mnie, ponieważ obie struktury stołu idealnie pasują. Wydaje mi się, że źle rozumiem „Dołącz do pola” i „Pole docelowe”. Czy możesz dodać więcej szczegółów?
Laurent Robitaille-Lainesse
1
@Laurent Robitaille-Lainesse Zaktualizowałem swój post bardziej szczegółowym przewodnikiem. Dołączyłem testowy plik Excel do pliku kształtu wielokąta, aby upewnić się, że moje kroki są prawidłowe.
wyd. Dziękuję
Suceed, aby poprawnie dołączyć mój plik Excel do QGIS. Zauważam, że opcja «dołącz» dodaje nowe pole do tabeli atrybutów. Popraw mnie, jeśli się mylę, ale wydaje się niemożliwe dodanie danych z mojego pliku Excela do pustego pola w mojej tabeli atrybutów.
Laurent Robitaille-Lainesse
1
Jeśli masz puste pole, użyj kalkulatora pola, aby zapełnić nowo połączone pole do pola w tabeli.
red. Dziękuję
10

Aby dodać inną metodę, możesz skonfigurować makro projektu, które po załadowaniu:

  1. Automatycznie łączy plik shapefile z plikiem csv
  2. Aktualizuje pola IP1iIP2
  3. Usuwa połączone pola, pozostawiając tylko pola pliku kształtu (tj. Bez dulplicates)

Najpierw utwórz projekt, jeśli jeszcze tego nie zrobiłeś, a następnie przejdź do paska narzędzi:

Projekt> Właściwości projektu ...> Makra

Następnie użyj następującego kodu w def openProject():funkcji i wprowadź nazwy warstw oraz pola, które chcesz połączyć. Użyłem „Przykład” i „arkusz kalkulacyjny” odpowiednio dla mojego pliku shapefile i pliku csv z polem 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())

Makro projektu

Upewnij się, że warstwy nie są połączone, zapisz projekt i włącz makra , przechodząc do paska narzędzi:

Ustawienia> Ogólne> Włącz makra


Teraz, kiedy zamykasz projekt i edytujesz plik csv, przy następnym ładowaniu projektu pola powinny zostać automatycznie zaktualizowane:

Edycja pliku csv

Wyniki

Joseph
źródło
7

Moja sugestia to użycie otwartego źródła LibreOffice / Open Office do edycji pliku Excel i utworzenia pliku .dbf. Przygotowałem dla ciebie skoroszyt testowy. Skoroszyt testowy - link

  1. Otwórz plik w Libre Office / Open Office.
  2. Wklej do arkusza „Excel” z pliku Excela.
  3. Wklej do arkusza „DBF” z pliku .dbf (wklej tylko ID, X, Y) (wartości IP1, IP2 zostaną dodane automatycznie).
  4. Zapisz jako plik name.dbf (gdzie nazwa jest taka sama jak nazwa pliku kształtu).

Tabela wyników bez duplikatów w QGIS: wprowadź opis zdjęcia tutaj

Artec
źródło
5

Dlaczego zaczynają się puste pola? Czy możesz zacząć bez pustych pól i po prostu użyć dwóch kolumn utworzonych w złączeniu? Myślę, że to najprostsze podejście. Albo to, albo znajdź narzędzie podobne do narzędzia „Załaduj” w ArcGIS.

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

Jeśli nie korzystasz z geobazy, bardzo to polecam.

Stella
źródło
Nie używam geobazy. W rzeczywistości nie znam tego.
Laurent Robitaille-Lainesse
1
@ LaurentRobitaille-Lainesse Gorąco polecam utworzenie nowej geobazy danych pliku, a następnie nowej klasy obiektów w tej grupie i wykorzystanie jej do przechowywania danych. Polecam także przeprowadzenie krótkich badań na temat geobaz i klas obiektów oraz dlaczego ich używamy, co oferują poza plikami kształtowymi.
Stella
4

Nie wiem, czy istnieje bezpośredni sposób dołączenia bez zduplikowania, ponieważ obsługa tego pliku .shp poprzez atrybut .DBF (plik bazy danych). Ten DBF ma deklarację typu kolumny, taką jak liczba całkowita, liczba rzeczywista, łańcuch itp. Ze szczegółami dotyczącymi jego długości i precyzji. Plik CSV ma tylko normalną kolumnę bez zadeklarowanego typu. Nie wiem, jak duży jest twój plik. Dla mnie zachowam zduplikowane pola, a następnie użyję kalkulatora pola o ogólnej formule:

Original Field_x = Duplicate Field_x

Następnie usuń wszystkie zduplikowane pola (przez QGIS lub program bazy danych)

Uje Indo
źródło
3

Uważam, że najprostszym sposobem na rozwiązanie tego problemu jest po prostu usunięcie dwóch kolumn w tabeli QGIS przed dołączeniem. Następnie, po dołączeniu do pliku kształtu, dwie kolumny, które chcesz, nie będą duplikatami i zachowają oryginalne nazwy kolumn.

RHB
źródło