Посмотрите еще раз, как использовать dask-geopandas для обработки больших географических данных.
Посмотрите еще раз, как использовать dask-geopandas для обработки больших географических данных.

Предисловие

Письма читателей

я был раньше 1. Сначала используйте растр Arcgis для преобразования точек. 2. Добавьте координаты xy к точке. 3. Добавьте к точкам атрибуты административного района после добавления координат xy через пространственную связь. 4. Наконец, рассчитайте центроид назначенной административной области. Предыдущее решение заключалось в использовании arcgis для выполнения первого и второго шагов. Хотя завершение было очень медленным, казалось, что большой проблемы не было. Но на третьем этапе arcgis зависнет, а затем и geopandas. Позже я узнал о dask-geopandas, но он вроде сообщал об ошибке после обработки около двух миллионов точек. Не знаю, есть ли проблема. с кодом, который я написал, или со мной. У меня проблемы с пониманием dask, и я хочу спросить у кого-нибудь совета.

Вопрос читателя включает в себя ряд шагов в операциях географической информационной системы (ГИС), включая преобразование растровых данных в точечные данные, добавление координат XY к этим точечным данным, добавление атрибутов административной области к этим точкам посредством пространственных связей и расчет обозначенных административных территорий. центр масс. Читатель не столкнулся с очевидными проблемами при использовании программного обеспечения ArcGIS для выполнения первых двух шагов, но столкнулся с узким местом в производительности при выполнении третьего шага, то есть система зависала при использовании ArcGIS и GeoPandas для выполнения операций пространственного соединения. Чтобы решить эту проблему, читатель попытался использовать dask-geopandas для обработки данных около двух миллионов точек, но, похоже, столкнулся с ошибкой.

В ответ на эту ситуацию мы можем проанализировать и внести предложения по нескольким аспектам:

Анализ узких мест производительности:

ArcGIS и GeoPandas могут испытывать проблемы с производительностью при обработке больших объемов данных, особенно при работе на скромном оборудовании. Это связано с тем, что эти операции часто требуют больших объемов памяти и ресурсов ЦП. Пространственное соединение, особенно при большом объеме точечных данных, является ресурсоемкой операцией, поскольку требует для каждой точки проверки ее пространственного соотношения с другими геометрическими объектами (например, границами административных округов). Использование dask-geopandas:

dask-geopandas направлен на решение аналогичных проблем с производительностью, повышая эффективность обработки крупномасштабных геопространственных данных посредством параллельных вычислений и отложенного выполнения. Если вы столкнулись с ошибками при использовании dask-geopandas, это может быть связано с множеством причин, включая, помимо прочего, проблемы с кодом, управлением памятью, планированием задач и т. д. Чтобы лучше диагностировать проблему, необходимо изучить конкретное содержание сообщения об ошибке. Это может указывать на проблему с конфигурацией, недостаточность ресурсов или логическую ошибку кода. Предложения по оптимизации:

Распределение ресурсов. Убедитесь, что имеется достаточно вычислительных ресурсов (ЦП и памяти) для обработки данных. Для dask-geopandas производительность можно оптимизировать, регулируя количество рабочих процессов и ограничения памяти Dask. Проверка кода. Тщательно проверьте код реализации, особенно часть dask-geopandas, чтобы убедиться, что функции параллельных вычислений и разделения данных используются правильно. Пакетная обработка: если возможно, старайтесь обрабатывать данные меньшими партиями, а не обрабатывать все точки одновременно. Это может помочь снизить нагрузку на память. Индексирование и оптимизация. Перед выполнением пространственных соединений создание пространственных индексов для данных административных округов может значительно повысить эффективность запросов.

Обратите внимание, что вам необходимо распаковать входной файл RAR перед запуском программы.

развертывание среды dask_geopandas

Потратив некоторые усилия на решение проблемы окружающей среды, выполните следующие действия, чтобы использовать dask_geopandas.

In [1]:

Язык кода:javascript
копировать
Язык кода:javascript
копировать
!pip install dask_geopandas -i https://pypi.mirrors.ustc.edu.cn/simple/
!pip install PyGEOS -i https://pypi.mirrors.ustc.edu.cn/simple/
!pip install --upgrade shapely https://pypi.mirrors.ustc.edu.cn/simple/
!pip install pyogrio -i https://pypi.mirrors.ustc.edu.cn/simpl
Язык кода:javascript
копировать

dask_geopandas простой пример

Преобразование DataFrame GeoPandas в DataFrame Dask-GeoPandas Сначала используйте GeoPandas для чтения файла географических данных:

питон импортировать геопанды df = geopandas.read_file('...') # Замените '...' своим путем к файлу Затем преобразуйте его в DataFrame Dask-GeoPandas:

python import dask_geopandas

Разделите фрейм данных GeoPandas на DataFrame Dask-GeoPandas, который разделен на 4 части.

ddf = dask_geopandas.from_geopandas(df, npartitions=4) По умолчанию это просто перераспределяет данные на основе строк. Однако вы также можете обеспечить пространственное разделение, чтобы воспользоваться преимуществами пространственной структуры GeoDataFrame.

python

Выполнить перераспределение пространства

ddf = ddf.spatial_shuffle() Знакомые пространственные свойства и методы из GeoPandas также доступны и будут рассчитываться параллельно:

python

Вычислить площадь геометрического объекта

ddf.geometry.area.compute()

Проверьте, находится ли геометрический объект внутри многоугольника

ddf.within(многоугольник) Кроме того, если у вас есть распределенный dask.dataframe, вы можете передать столбец точек XY в метод set_geometry, чтобы установить геометрию.

python import dask.dataframe as dd import dask_geopandas

Чтение данных из файла CSV

ddf = dd.read_csv('...') # Замените '...' своим путем к файлу

Установите геометрию, используя широту и долготу

ddf = ddf.set_geometry( dask_geopandas.points_from_xy(ddf, 'долгота', 'широта') ) В настоящее время поддерживает запись (и обратное чтение) форматов файлов Parquet и Feather:

python

Запись в файл Parquet

ddf.to_parquet("path/to/dir/")

Чтение из файла Parquet

ddf = dask_geopandas.read_parquet("путь/к/каталогу/") Традиционные форматы файлов ГИС можно считывать в секционированные GeoDataFrames (требуется pyogrio), но запись не поддерживается:

python

Прочтите файл, здесь в качестве примера мы берем файл GeoPackage и указываем количество разделов 4

ddf = dask_geopandas.read_file("file.gpkg", npartitions=4) Выше приведен простой пример использования Dask-GeoPandas для эффективной обработки больших геопространственных данных.

Оригинальная программа

In [2]:

Язык кода:javascript
копировать
Язык кода:javascript
копировать
import geopandas as gpd
import time # Добавить модуль времени

# Добавить модуль даск
import dask_geopandas

def process_row():
    outwen = '/home/mw/input/dask6250/201105.shp'
    bianjie = '/home/mw/input/dask6250/xian/2023xian.shp'
    jiabianjie = './'
    
    start_time3 = time.time()
    
    # Чтение входных данных и границ обрезки shapefile
    target_gdf = gpd.read_file(outwen)
    join_gdf = gpd.read_file(bianjie)
    
    # Перейти в рабочий режим
    target_gdfnew = dask_geopandas.from_geopandas(target_gdf, npartitions=4)
       
    # Перепроецируйте границы участвующих соединений, чтобы они соответствовали целевой геометрии. CRS
    join_gdf = join_gdf.to_crs(target_gdf.crs)
    
    # Перейти в рабочий режим
    join_gdfnew = dask_geopandas.from_geopandas(join_gdf, npartitions=4)
    
    # Найдите пересекающиеся части, используя пространство соединять
    joined = gpd.sjoin(target_gdfnew, join_gdfnew, how='inner', predicate='intersects')
    
    # Воля 'bianjie' Свойства в добавлены в 'outwen' середина
    joined = joined.drop(columns='index_right')  # Удаление избыточных столбцов индекса
    result = target_gdfnew.merge(joined, how='left', on=target_gdfnew.columns.to_list())
    
    # Сохранение результатов в границах вывода
    result.to_file(jiabianjie,  encoding='utf-8-sig')  # Обязательно используйте правильную кодировку
    
    end_time3 = time.time()
    execution_time3 = end_time3 - start_time3
    
    print(f"'{jiabianjie}' добавил границу, время начала: {start_time3:.2f}, время окончания: {end_time3:.2f}, время выполнения: {execution_time3:.2f} секунд ")

process_row()

print('finish')
Язык кода:javascript
копировать

Хорошо, память исчерпана после некоторого времени работы. Вам следует рассмотреть следующие стратегии оптимизации:

  1. Чтение шейп-файлов прямо в Dask

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

Язык кода:javascript
копировать
python    
target_dgdf = dask_geopandas.read_file(outwen, npartitions=4)    
join_dgdf = dask_geopandas.read_file(bianjie, npartitions=4)
  1. Избегайте ненужного копирования данных

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

  1. Используйте более эффективное пространство

При использовании dask_geopandas для пространственных соединений убедитесь, что операция эффективна. Ваш код пытается использовать geopandas.sjoin, но следует использовать dask_geopandas.sjoin. Кроме того, перед выполнением пространственного соединения убедитесь, что два набора данных имеют совпадающие системы координат (CRS). Это позволяет избежать повторения дорогостоящих операций преобразования CRS в каждом разделе.

  1. Настроить nразделов

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

  1. Проверьте последние шаги сохранения

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

2.0

Измените параметры npartitions для своих ресурсов.

In [1]:

Язык кода:javascript
копировать
Язык кода:javascript
копировать
import dask_geopandas as dgd
import time

input_shapefile = '/home/mw/input/dask6250/201105.shp'
boundary_shapefile = '/home/mw/input/dask6250/xian/2023xian.shp'
output_directory = './output/'

def process_row(target_gdf, join_gdf, jiabianjie_pat):


    start_time = time.time()
    
    # Чтение шейп-файлов напрямую с помощью dask-geopandas
    target_dgdf = dgd.read_file(input_shapefile, npartitions=16)
    join_dgdf = dgd.read_file(boundary_shapefile, npartitions=16)
    
    # Убедитесь, что шейп-файл границы соответствует CRS целевого шейп-файла.
    join_dgdf = join_dgdf.to_crs(target_dgdf.crs)
    
    # Найдите пересекающиеся части, используя пространство соединять
    joined = dgd.sjoin(target_dgdf, join_dgdf, how='inner', predicate='intersects')
    
    # Удаление избыточных столбцов индекса
    joined = joined.drop(columns='index_right')
    

    joined.compute().to_file(output_directory + 'result.shp', driver='ESRI Shapefile', encoding='utf-8')

    # end_time = time.time()
    # print(f"Границы были добавлены. Время начала: {start_time:.2f}, время окончания: {end_time:.2f}, время выполнения: {end_time - start_time:.2f} секунд")

if __name__ == "__main__":
    process_row(input_shapefile,boundary_shapefile,output_directory)
    print('finish')
Язык кода:javascript
копировать

In [ ]:

Язык кода:javascript
копировать
Язык кода:javascript
копировать
import dask_geopandas as dgd
import time
import gc  # Импортируйте сборщик мусора

input_shapefile = '/home/mw/input/dask6250/201105.shp'
boundary_shapefile = '/home/mw/input/dask6250/xian/2023xian.shp'
output_directory = './'

def process_row(target_gdf, join_gdf, jiabianjie_pat):
    start_time = time.time()
    
    # В зависимости от конфигурации вашего оборудования nразделов, уменьшите количество разделов, чтобы уменьшить накладные расходы на Память
    target_dgdf = dgd.read_file(input_shapefile,npartitions=16)  # соответствующий Настроить nразделов
    join_dgdf = dgd.read_file(boundary_shapefile,npartitions=16)  # соответствующий Настроить nразделов
    
    join_dgdf = join_dgdf.to_crs(target_dgdf.crs)
    
    joined = dgd.sjoin(target_dgdf, join_dgdf, how='inner', predicate='intersects')
    
    joined = joined.drop(columns='index_right')
    
    # Запустите сбор мусора перед вычислением результата
    gc.collect()
    
    joined.compute().to_file(output_directory + 'result.shp', driver='ESRI Shapefile', encoding='utf-8')
    
    # Вручную запустить выпуск сборки мусора Память
    gc.collect()

    end_time = time.time()
    print(f"Границы были добавлены. Время начала: {start_time:.2f}, время окончания: {end_time:.2f}, время выполнения: {end_time - start_time:.2f} секунд")

if __name__ == "__main__":
    process_row(input_shapefile, boundary_shapefile, output_directory)
    print('finish')
Язык кода:javascript
копировать
Язык кода:javascript
копировать
/opt/conda/lib/python3.9/site-packages/geopandas/_compat.py:111: UserWarning: The Shapely GEOS version (3.10.0-CAPI-1.16.0) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.
  warnings.warn(
/opt/conda/lib/python3.9/site-packages/geopandas/io/file.py:362: FutureWarning: pandas.Int64Index is deprecated and will be removed from pandas in a future version. Use pandas.Index with the appropriate dtype instead.
  pd.Int64Index,

3.0

Пакетный запуск и сохранение с помощью gpkg

In [3]:

Язык кода:javascript
копировать
Язык кода:javascript
копировать
import dask_geopandas as dgd
import time
import gc
from dask import delayed, compute  # отdaskсередина импортировать вычислительную функцию

input_shapefile = '/home/mw/input/dask6250/201105.shp'
boundary_shapefile = '/home/mw/input/dask6250/xian/2023xian.shp'
output_directory = './'

@delayed
def process_batch(batch, join_gdf, output_path):
    # Воляграницаданные Преобразовать в Система координат целевых данных
    join_gdf = join_gdf.to_crs(batch.crs)
    
    # пространство исполнения соединять
    joined = dgd.sjoin(batch, join_gdf, how='inner', predicate='intersects')
    
    # Удалить ненужные столбцы
    joined = joined.drop(columns='index_right')
    
    # Рассчитайте и сохраните результаты
    joined.compute().to_file(output_path, driver='GPKG', layer='result', encoding='utf-8')  # Использование формата GeoPackage

def main():
    start_time = time.time()
    
    # Явно укажите npartitions
    target_dgdf = dgd.read_file(input_shapefile, npartitions=16)  # Задайте npartitions явно
    join_dgdf = dgd.read_file(boundary_shapefile, npartitions=16)  # Задайте npartitions явно
    
    # Воля пакетная обработка набора целевых данных
    batches = target_dgdf.to_delayed()
    
    tasks = [process_batch(batch, join_dgdf, f"{output_directory}result_{i}.gpkg") for i, batch in enumerate(batches)]
    
    # Используйте функцию вычислений dask для выполнения всех отложенных задач.
    compute(*tasks)
    
    gc.collect()  # Вручную запустить выпуск сборки мусора Память
    
    end_time = time.time()
    print(f"Границы были добавлены. Время начала: {start_time:.2f}, время окончания: {end_time:.2f}, время выполнения: {end_time - start_time:.2f} секунд")

if __name__ == "__main__":
    main()
    print('finish')
Язык кода:javascript
копировать
Язык кода:javascript
копировать
/opt/conda/lib/python3.9/site-packages/geopandas/_compat.py:111: UserWarning: The Shapely GEOS version (3.10.0-CAPI-1.16.0) is incompatible with the GEOS version PyGEOS was compiled with (3.10.4-CAPI-1.16.2). Conversions between both will be slow.
  warnings.warn(

Обратите внимание, что из-за ограничений ресурсов приведенный выше окончательный результат не был полностью выполнен. Вы можете видеть, что в каталоге проекта все еще есть часть gpkg. Поскольку размер выходного файла превышает лимит в 1 г, если вам интересно, запустите его на своем компьютере и измените параметры в соответствии с соответствующими ресурсами.

Кроме того, gpkg можно конвертировать в нужный шп с помощью геопанд.

In [ ]:

Язык кода:javascript
копировать
Язык кода:javascript
копировать
import geopandas as gpd
import pandas as pd

# Список документов GeoPackage
gpkg_files = ['path/to/your/first_file.gpkg', 'path/to/your/second_file.gpkg']

# Прочитать весь документ GeoPackage в список GeoDataFrameсередина
gdf_list = [gpd.read_file(gpkg) for gpkg in gpkg_files]

# Объединение объектов GeoDataFrame
merged_gdf = pd.concat(gdf_list, ignore_index=True)

# Укажите путь к выходному шейп-файлу
output_shp_path = 'path/to/your/output_file.shp'

# Воля Объединенный GeoDataFrame сохраняется как шейп-файл.
merged_gdf.to_file(output_shp_path, driver='ESRI Shapefile')

print(f"Объединенный шейп-файл был сохранен в: {output_shp_path}")
Язык кода:javascript
копировать

Нажмите ссылку, чтобы просмотреть полный код и работающий онлайн-код.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose