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

11

У меня есть проблема, которую я, кажется, не могу понять. У меня есть два слоя многоугольника:

  • Многоугольник A - это подмножество многоугольника B с теми же полями и имеет многоугольники, идентичные многоугольнику B
  • Polygon B - содержит данные атрибута, который я хочу видеть в Polygon A

Как это может быть сделано? Я попробовал инструмент QGIS «Объединить атрибуты по местоположению», но поскольку некоторые из полигонов находятся внутри других, он имеет тенденцию связываться с первым найденным пересечением (внешним многоугольником).

Диего Р
источник
создать центроиды (точки) многоугольника A, объединить атрибуты с B и экспортировать в новый файл, чтобы сохранить атрибуты из A.
Mapperz
3
@Mapperz Это опасный подход, потому что он может привести к ошибкам, даже если он обычно генерирует вероятный ответ. Если полигоны перекрывают друг друга, все ставки отключены. Даже если нет перекрытий, центроид многоугольника может находиться внутри другого (не перекрывающегося) многоугольника. Корректность может быть гарантирована в общем случае только тогда, когда все многоугольники в A не перекрываются и выпуклы.
whuber
+1 @ Диего - ваш вопрос приведет к довольно интересной дискуссии / дебатам; интересный в этом!
Дано

Ответы:

9

@Dano справедливо поднимает некоторые вопросы, которые лучше всего решать в полном ответе.

Одна из трудностей , уже отмеченных @Celenius, заключается в том, что соединение между B и A (в любом направлении) дублирует все поля; исправить это может быть обременительно. В комментариях я предположил, что очевидный простой способ (экспорт в электронную таблицу) поднимает вопросы целостности данных. Другая трудность , уже затронутая предложением Celenius, касается решения этой проблемы, когда никакая комбинация атрибутов не может служить ключом как для A, так и для B, поскольку это исключает объединение базы данных. Пространственное соединение обходит эту проблему.

Что же тогда является хорошим решением? Один подход использует A для идентификации соответствующих записей B, содержащих требуемые данные. В зависимости от предположений о конфигурации многоугольников - перекрываются ли они, могут ли некоторые содержать другие и т. Д. - это может быть выполнено различными способами: используя один слой для выбора объектов в другом или с помощью объединений. Дело в том, что все, что мы хотим сделать на этом этапе, это выбрать подмножество B, соответствующее A.

Получив этот выбор, экспортируйте его и дайте ему заменить A. Готово .

Это решение предполагает, что все поля в B предназначены для замены их аналогов в A. Если нет, то действительно необходимо выполнить соединение 1-1 B (источник) с A (пункт назначения). Объединение на основе идентификаторов является лучшим, но создание объединения на основе многоугольника (Celenius) работает хорошо, если идентификаторы недоступны и нет шансов, что соответствующие формы многоугольников в A и B могут отличаться, хотя и незначительно . (Это тонкий момент и потенциальная причина коварных ошибок, потому что предыдущие правки в B в многоугольники, которые не соответствуют A, все еще могли бы незаметно изменить другие многоугольники в B, если ГИС "привязывает" или "поддерживает топологию" или иным образом автоматически вносить глобальные изменения во время локального редактирования.)

На данном этапе имеется две копии каждого поля: если [Foo] является общим полем для A и B, то объединение содержит A. [Foo] и B. [Foo]. Используя вычисление поля , скопируйте B. [Foo] в A. [Foo]. Повторите для всех необходимых полей. После этого удалите соединение.

Хотя эта процедура может быть немного обременительной, когда задействовано много полей, ее достоинства включают

  • Это простой и быстрый сценарий.
  • Написание сценария оставляет контрольный журнал, документирующий обработку данных. Это крайне важно для защиты целостности данных.
  • Он защищает от некоторых видов оптовых ошибок, таких как сохранение неправильного поля после объединения (таким образом, сохраняя старые данные вместо новых данных для этого поля) или удаляя критическое поле.
  • Он использует встроенные средства защиты, предлагаемые системой управления базами данных, такие как принудительное применение типов данных и бизнес-правил, которые используются для предотвращения и выявления ошибок, а также для обеспечения согласованности всех таблиц и слоев в базе данных.

Некоторые из руководящих принципов, связанных с этим предложением,

  1. Используйте вашу систему управления базами данных для обработки данных, а не программное обеспечение, не предназначенное или не подходящее для этой задачи.
  2. Избегайте изменения структур базы данных (таких как удаление или добавление полей), когда операциям это абсолютно не нужно.
  3. Используйте возможности программного обеспечения для автоматизации, чтобы упростить работу, задокументировать ее и сделать операции воспроизводимыми.

Кто-то может возразить, что во многих случаях существуют более быстрые и простые способы достижения того же результата. Да, могут быть, и они могут быть эффективными, и обычно они работают, когда выполняются с осторожностью. Но решения, которые рискуют данными, трудно рекомендовать и защищать как ответы общего назначения. Лучше всего их использовать в одноразовых ситуациях с небольшими наборами данных, где коррупция в данных должна быстро стать очевидной, а последствия любых таких ошибок несущественны.

Whuber
источник
+1 @ whuber - очевидно, что вы попытались взвесить все переменные здесь; хорошо продуманный ответ. Пожалуйста, ознакомьтесь с дополнением к моему первоначальному ответу, так как у меня не хватит места в этом поле для комментариев.
Дано
1
для людей, интересующихся тем, что случилось с «Целениусом», упомянуты различные места в этой теме: теперь известен как @djq, и его / ее ответ здесь . Престижность машины обратного хода: web.archive.org/web/20120127210858/http://gis.stackexchange.com/…
Мэтт Уилки
5

В Arcmap вы можете пространственно соединить Polygon B с Polygon A; это будет связано атрибутов. Поскольку имена полей совпадают, это создаст новую комбинацию имени.

djq
источник
Это то, что я бы поставил. На мой взгляд, этот короткий ответ правильный.
Саймон
4

Экспортируйте таблицу для шейп-файла "B" в Excel и удалите избыточные столбцы, а также любые столбцы, содержащие информацию, которая вам не нужна. Убедитесь, что вы храните столбец общего идентификатора, а затем сохраните его в соответствующей папке. Зайдите в ArcMap, добавьте таблицу, затем щелкните правой кнопкой мыши по шейп-файлу "A" и выполните объединение таблиц . Ссылка должна привести к видео о том, как это сделать.


@ whuber - весь подход является надежным и обеспечивает целостность данных. Единственное, что я могу сказать, чтобы опровергнуть этот ответ, - это то, что определенные ситуации / проекты не дают нам времени или бюджета для того, чтобы использовать этот метод в нашем подходе.

Пример из жизни:

Молодежная горнодобывающая компания сидит на крупном рудном теле с денежными вливаниями в сотни миллионов долларов, основанными на их способности «доказать» ресурс. Настольный обзор публикаций и геологических карт / данных приводит к очень целевой и очень дорогой программе бурения. Когда анализы возвращаются из первого запуска, эти значения помечаются в соответствующих точках с помощью объединения таблиц и выкачиваются обратно в формате Excel, где данные тщательно подготавливаются для импорта в DataMine (для трехмерной интерполяции или преобразования тела).

По моему опыту , проект Геологи требовал, чтобы эти данные были предварительно подготовлены в Excel, чтобы они следовали КАЖДОМУ правилу / условию форматирования до буквы (без пробелов, без специальных символов и т. Д.) И чтобы файл импорта DataMine был доставлен в формате .csv. (тогда все равно). Это приведет к увеличению инвестиций в целевое бурение, и мы будем многократно пересматривать этот процесс (в некоторых случаях). Все это обычно происходило в исключительно сжатые и критические сроки.

У каждого из нас есть своя собственная история и наш собственный опыт, который мы включили в наш подход к тому, как мы делаем вещи. Сказав это, мой опыт рассматривает Excel как абсолютную необходимость и жизненно важный инструмент в моих рабочих процессах; это то, что я знаю. Мы принимали все меры предосторожности при подготовке этих данных. Где бы вы, ребята, уклонялись от Excel, у меня не было выбора, кроме как использовать его.

Дано
источник
(-1) Использование Excel для выполнения объединения не только сложнее, чем его выполнение с помощью ГИС или СУБД, но также вызывает серьезные ошибки.
whuber
8
Excel прост, он работает, и из-за этого он, вероятно, ответственен за большее количество необнаруженных ошибок, чем любое программное обеспечение, когда-либо созданное. Он нарушает базовые принципы СУБД, которые были разработаны для защиты от ошибок, которые Excel делает слишком простыми для фиксации, таких как (1) сортировка некоторых столбцов, но не других; (2) опечатки, которые изменяют типы данных; (3) случайные нажатия клавиш, которые стирают данные; (4) непреднамеренное удаление строк или столбцов; (5) скрытое преобразование данных, таких как текст в даты; (6) скрытое усечение данных; (7) скрытое округление числовых значений; и многое другое.
whuber
2
Этот ответ и последующий комментарий являются прекрасной иллюстрацией того, как «плохой» ответ может привести к хорошим результатам, раскрывая информацию, которая иначе не могла бы появиться. Пожалуйста, не думайте, что вы должны удалить его, чтобы избежать "попадания".
Мэтт Уилки
3
... и чтобы восполнить удар, БОЛЬШИМ ВОПРОСОМ было бы спросить, почему использование Excel для обработки данных может привести к очень серьезным проблемам. И как это безопасно использовать.
Мэтт Уилки
1
(+1) Для вдумчивого и хорошо описанного редактирования. @matt Ознакомьтесь с обсуждениями на stats.stackexchange.com относительно того, что было бы хорошим способом работы с большим набором данных в Excel? и Excel как инструментальные средства статистики .
whuber
1

В конце 1990-х годов мы получили крупномасштабную обновленную информацию обо всех наших водоемах и водотоках, охватывающую около 55 картографических листов NTS и неисчислимое количество объектов. Нам нужно было сохранить атрибуты добавленной стоимости нашей старой гидрологии (названия озер, высоту поверхности и т. Д.) И заменить геометрию. Геометрия старого и нового была достаточно близка, чтобы мы могли гарантировать, что центроиды каждого многоугольника будут по-прежнему ограничены границами нового многоугольника - это важный момент, без этой базовой уверенности подход, представленный ниже, не является хорошей идеей.

Решением в данном конкретном случае было вместо приведения атрибутов к геометрии, приведения геометрии к атрибутам. Итак, концептуально:

  1. из * Layer_with_attributes *, удаляйте полигоны, но сохраняйте записи таблицы,
  2. из * Layer_with_polys * скопировать и вставить геометрию в * Layer_with_attributes *
  3. объединить и сохранить.

Смотрите здесь для более подробного описания и рецепта для . Я не уверен, что в современных Arcgis или Qgis даже возможно удалить геометрию без одновременного удаления записи атрибута, но, на всякий случай, вот идея.

Мэтт Уилки
источник
1

Я не уверен, но, возможно, некоторые СУБД выполняют операции равенства на полях Shape в SQL (?). Мне кажется, что если две геометрии идентичны, =оператор SQL должен вернуть true ( WHERE A.Shape = B.Shape).

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


Похоже, для этого можно использовать метод ST_Equals (стандарт OGC).

Кирк Куйкендалл
источник
0

Как обычно, Вубер прав. Вы должны тщательно продумать свой процесс. Особенно, если это большие наборы данных, и эта операция будет выполняться много раз или данные критически важны.

Рассмотрим ваши данные и обязанности:

Что вы наделали?

Что делаешь?

Что ты собираешься делать?

И всегда спрашиваю: почему?


Теперь один простой ответ, направленный непосредственно на заданный вопрос. Помня, что всегда есть как минимум 5 способов сделать что-то, но обычно только один лучший способ.

Предполагая, что полный набор имеет каждый атрибут, которым вы хотите быть в подмножестве, и подмножество не имеет ничего, чего еще нет в полном наборе, кроме устаревшей информации.

Предполагая, что топология подмножества соответствует полному набору (включая Origin / Projection и XY Tolerance).

1) Используйте Feature to Point с установленным флажком «Inside» и создайте точечный класс пространственных объектов или шейп-файл из подмножества.

2) Используйте функцию «Выбрать по пространственному соединению», чтобы найти все полигоны в полном наборе, которые соответствуют подмножеству, на основе вновь созданного класса объектов Point или шейп-файла.

3) Экспортируйте Выбор из полного набора, и это может быть ваш новый набор.

user23715
источник
0

Конечно, если Polygon A является подмножеством Polygon B, самый простой подход будет заключаться в цикле по Polygon A, использовать идентификатор, который будет в Polygon A (и B, если A был подмножеством или B), для поиска данных строки в Polygon B, а затем обновите строку в Polygon A.

волосатый
источник