Для каждой из 208 781 группы блоков переписи я хотел бы получить идентификаторы FIPS всех соседей 1-го порядка. Я загрузил все границы TIGER и объединил их в один шейп-файл объемом 1 ГБ.
Я попробовал скрипт ArcPython, который использует SelectLayerByLocation для BOUNDARY_TOUCHES в своей основе, но он занимает более 1 секунды для каждой группы блоков, что медленнее, чем хотелось бы. Это даже после того, как я ограничиваю поиск SelectLayerByLocation, чтобы блокировать группы в том же состоянии. Я нашел этот скрипт , но он также использует SelectLayerByLocation внутри, так что он не быстрее.
Решение не должно быть на основе Arc - я открыт для других пакетов, хотя мне удобнее программировать на Python.
Ответы:
Если у вас есть доступ к ArcGIS 10.2 for Desktop или, возможно, ранее, я думаю, что инструмент Polygon Neighbors (Analysis) , который:
может сделать эту задачу намного проще сейчас.
источник
Для решения, избегающего ArcGIS, используйте pysal . Вы можете получить веса непосредственно из шейп-файлов, используя:
или
Отправляйтесь в документы за дополнительной информацией.
источник
Просто обновление. Следуя совету Уубер, я обнаружил, что Матрица генерирования пространственных весов просто использует петли и словари Python для определения соседей. Я воспроизвел процесс ниже.
Первая часть проходит по каждой вершине каждой группы блоков. Он создает словарь с координатами вершин в качестве ключей и список идентификаторов групп блоков, у которых вершина с этой координатой является значением. Обратите внимание, что для этого требуется топологически аккуратный набор данных, поскольку только идеальное перекрытие вершин / вершин будет регистрироваться как отношение соседей. К счастью, шейп-файлы группы блоков TIGER в Бюро переписей в этом отношении хороши.
Вторая часть снова проходит через каждую вершину каждой группы блоков. Он создает словарь с идентификаторами групп блоков в качестве ключей и идентификаторами соседей группы блоков в качестве значений.
Оглядываясь назад, я понимаю, что мог бы использовать другой метод для второй части, который не требовал бы повторения шейп-файла снова. Но это то, что я использовал, и он работает довольно хорошо даже для тысяч групп блоков одновременно. Я не пробовал делать это со всеми США, но он может быть выполнен для всего штата.
источник
Альтернативой может быть использование PostgreSQL и PostGIS . Я задал несколько вопросов о том, как выполнить аналогичные вычисления на этом сайте:
Я обнаружил, что есть крутая кривая обучения, чтобы выяснить, как различные части программного обеспечения сочетаются друг с другом, но я нашел это прекрасным для выполнения расчетов на больших векторных слоях. Я провел несколько вычислений ближайшего соседа для миллионов полигонов, и это было быстро по сравнению с ArcGIS.
источник
Просто некоторые комментарии ... метод esri / ArcGIS в настоящее время использует словари для хранения информации, но основные вычисления выполняются в C ++ с использованием инструмента Polygon Neighbour Tool. Этот инструмент генерирует таблицу, которая содержит информацию о смежности, а также необязательные атрибуты, такие как длина общей границы. Вы можете использовать инструмент Generate Spatial Weights Matrix Tool, если хотите сохранить, а затем повторно использовать информацию снова и снова. Вы также можете использовать эту функцию в WeightsUtilities для создания словаря [произвольного доступа] с информацией о смежности:
где inputFC = любой класс объектов полигонов любого типа, masterField - это поле "уникальный идентификатор" целых чисел и contiguityType в {"ROOK", "QUEEN"}.
В esri предпринимаются попытки пропустить табличный аспект для пользователей Python и перейти непосредственно к итератору, который значительно ускорил бы многие случаи использования. PySAL и пакет spdep в R - фантастические альтернативы [см . Ответ radek] . Я думаю, что вы должны использовать шейп-файлы в качестве формата данных в этих пакетах, который настроен с этим форматом ввода потоков. Не уверен, как они справляются с перекрывающимися полигонами, а также с полигонами внутри полигонов. Генерация SWM, а также функция, которую я описал, будут считать эти пространственные отношения соседями «ROOK» И «QUEEN».
источник