Присоединение данных из Excel к таблице атрибутов в QGIS без создания дубликатов?

15

У меня есть таблица атрибутов с двумя пустыми полями в QGIS.

Example_1

Я хочу импортировать базу данных Excel, чтобы заполнить мои пустые поля в QGIS. Мой файл Excel совпадает со столбцами в моей таблице атрибутов QGIS.

Example_2

Я могу правильно присоединить мой Excel (.CSV) к моему шейп-файлу. Тем не менее, процесс, вместо того, чтобы заполнить пустые поля, как я хотел, создал дубликаты. С помощью «Table Manager» я могу исправить ситуацию, но это требует много времени. Я ищу более эффективный способ присоединиться к моим данным Excel.

Example_3

Как я могу присоединить мой файл Excel к моей таблице атрибутов без создания дубликатов?

Лоран Робитай-Ленесс
источник
3
Взгляните на этот урок: Выполнение соединений за столом
ArMoraer

Ответы:

13

Я бы сделал следующие вещи, чтобы облегчить жизнь:

Прежде чем сделать это, сделайте резервную копию своего шейп-файла.

  1. В своем шейп-файле перейдите к свойствам / полям слоя и включите режим редактирования.
  2. выбрать все поле, кроме поля идентификатора
  3. Удалить все поля, кроме поля ID
  4. добавьте ваш CSV-файл в качестве слоя в QGIS (Главное меню / Слой / Добавить слой / Добавить текстовый слой с разделителями) введите описание изображения здесь(не выбирайте геометрию)
  5. в своем шейп-файле выберите свойства / объединения и выберите оба поля идентификатора для источника и цели. Как описано в другом ответе на этот вопрос.
  6. Сохраните ваш измененный шейп-файл.

введите описание изображения здесь

это вкладка поля, я имею в виду

введите описание изображения здесь

Не забудьте переключить редактирование до и после удаления ненужного поля

RutgerH
источник
13

Вы захотите присоединить файл Excel к шейп файлу. Вы присоедините их к общему атрибуту, и в результате вы получите объединенный слой, в котором каждая запись содержит атрибуты как шейп-файла, так и файла Excel.

Хорошо, сначала вы загружаете свой файл Excel и свой вектор позже в слои. Я использовал некоторые тестовые данные, которые я сделал, но ваши настройки должны выглядеть примерно так, как показано ниже. введите описание изображения здесь

Теперь щелкните правой кнопкой мыши на слое (на панели слоев) и выберите свойства, затем выберите соединение. Сначала нажмите зеленый знак + в левом нижнем углу (большая красная стрелка на рисунке ниже), и откроется новое меню «Добавить объединение векторов» (как показано ниже). Здесь вашим слоем объединения будет файл Excel (поэтому выберите подходящий файл Excel). & sheet) поле соединения - это поле в файле Excel, которое содержит общий атрибут шейп-файла. Целевое поле - это совпадающее поле в шейп-файле. (в моем случае оба общих поля оказались именованными единицами, но если бы поле называлось UNIT_ в шейп-файле, я бы использовал это вместо UNIT для моего целевого поля)
введите описание изображения здесь Есть несколько других опций, с которыми вы можете связываться при объединении, например, если вы хотите видеть только определенные поля и т. Д. ... в любом случае, теперь они объединяются, и если вы вернетесь и посмотрите на атрибуты шейп-файла, вы увидите теперь он имеет соответствующие атрибуты файла Excel, как показано ниже.

введите описание изображения здесь

Вот несколько удобных руководств, чтобы шаг за шагом показать вам, как это сделать:

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

Как объединить внешние таблицы с таблицей атрибутов шейп-файла в QGIS?

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

и учебник ArMoraer, упомянутый в комментариях.

ed.hank
источник
Я посмотрел учебник mapbox.com/tilemill/docs/guides/joining-data , который, кстати, был очень полезен. Тем не менее, я все еще не могу присоединить файл DBF к шейп-файлу. Это удивляет меня, потому что обе мои структуры таблицы идеально совпадают. Кажется, я неправильно понимаю «Поле соединения» и «Поле цели». Не могли бы вы добавить более подробную информацию, пожалуйста?
Лоран Робиталь-Лейнс
1
@Laurent Robitaille-Lainesse Я обновил свой пост более пошаговым руководством. Я присоединил тестовый файл Excel к шейп-файлу многоугольника, чтобы убедиться, что мои шаги верны.
ed.hank
Мне удалось правильно присоединить мой файл Excel к QGIS. Я заметил, что опция «соединение» добавляет новое поле в таблицу атрибутов. Поправьте меня, если я ошибаюсь, но кажется невозможным добавить данные из моего файла Excel в пустое поле в моей таблице атрибутов.
Лоран Робиталь-Лейнс
1
Если у вас есть пустое поле, то вы используете калькулятор полей для заполнения от только что присоединенного поля к полю, имеющемуся в вашей таблице.
ed.hank
10

Просто чтобы добавить другой метод, вы можете настроить макрос Project, который при загрузке:

  1. Автоматически присоединяет ваш шейп-файл к вашему CSV
  2. Обновляет IP1и IP2поля
  3. Удаляет объединенные поля, оставляя только поля шейп-файла (т.е. без дубликатов)

Сначала создайте проект, если вы еще этого не сделали, а затем перейдите на панель инструментов:

Проект> Свойства проекта ...> Макросы

Затем используйте следующий код в def openProject():функции и введите имена ваших слоев и полей, к которым вы хотите присоединиться. Я использовал «Пример» и «Электронная таблица» для моего шейп-файла и CSV-файла соответственно с полем 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())

Макрос проекта

Убедитесь, что слои не объединены, сохраните проект и включите макросы , перейдя на панель инструментов:

Настройки> Общие> Включить макросы


Теперь, когда вы закрываете проект и редактируете CSV-файл, при следующей загрузке проекта поля должны автоматически обновляться:

Редактирование CSV-файла

Результаты

Джозеф
источник
7

Я предлагаю использовать LibreOffice / Open Office с открытым исходным кодом для редактирования файла Excel и создания файла .dbf. Я подготовил тестовую тетрадь для вас. Тестовая тетрадь - ссылка

  1. Откройте файл в Libre Office / Open Office.
  2. Вставьте данные листа Excel в файл Excel.
  3. Вставьте данные листа DBF в файл .dbf (вставьте только ID, X, Y) (значения IP1, IP2 будут добавлены автоматически).
  4. Сохранить как файл name.dbf (где имя совпадает с именем вашего файла формы).

Таблица результатов без дубликатов в QGIS: введите описание изображения здесь

Artec
источник
5

Почему пустые поля там для начала? Можете ли вы начать без пустых полей и просто использовать два столбца, созданные в соединении? Я думаю, что это самый простой подход. Либо так, либо найдите инструмент, похожий на инструмент «Загрузить» в ArcGIS.

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

Если вы не используете базу геоданных, я настоятельно рекомендую это.

Стелла
источник
Я не использую базу геоданных. На самом деле, я не знаком с этим.
Лоран Робитай-Ленесс
1
@ LaurentRobitaille-Lainesse Я настоятельно рекомендую создать новую файловую базу геоданных, затем новый класс пространственных объектов и использовать ее для хранения ваших данных. Я также рекомендую провести небольшое исследование баз геоданных и классов пространственных объектов и узнать, почему мы их используем, что они предлагают помимо шейп-файлов.
Стелла
4

Я не знаю, существует ли прямой способ присоединения без дубликатов, поскольку поддержка этого файла .shp осуществляется посредством атрибута в .DBF (файл базы данных). Этот DBF имеет объявление типа столбца, такого как целое число, вещественное число, строка и т. Д. С подробным описанием его длины и точности. Файл CSV имеет только нормальный столбец без какого-либо объявленного типа. Я не знаю, насколько велик твой файл. Для меня я сохраню дубликаты полей, а затем использую калькулятор полей с общей формулой:

Исходное поле_x = дубликат поля_x

Затем удалите все эти дублированные поля (через QGIS или программу базы данных)

Uje Indo
источник
3

Я считаю, что самый простой способ исправить это - просто удалить два столбца в таблице QGIS перед объединением. Затем, когда вы присоединитесь к шейп файлу, два столбца, которые вы хотите, не будут дубликатами и сохранят свои исходные имена столбцов.

RHB
источник