Растворение Python вызывает ошибку TopologyException

Я использую функцию dissolve, чтобы сжать фрейм данных геопанд в меньшую таблицу с меньшим количеством строк. Я читал в Интернете, что один из способов исправить недопустимый многоугольник - создать буфер 0 для его геометрических объектов. Итак, я сделал это. Я исправил некоторые полигоны, но по-прежнему дает ту же ошибку для других полигонов. Может ли кто-нибудь дать несколько советов о том, что еще я могу сделать, чтобы исправить эту ошибку?

burn_grass['geometry'] = burn_grass.geometry.buffer(0)
burn_grass.is_valid.unique()
output:array([ True], dtype=bool)

burn_grass = burn_grass.dissolve(by=['UUID'], as_index=False)

выход:

TopologyException: ввод geom 1 недействителен: самопересечение в точке 130.94262695312494 -19.395507812500028 или рядом с ней в 130.94262695312494 -19.395507812500028 pandas / _libs / src \ reduce.pyx в pandas._libs.lib.SeriesGrouper.get


person Karen Chen    schedule 16.01.2018    source источник


Ответы (1)


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

Итак, я выбрал мультиполигон на основе UUID и воссоздал gpd со списком мультиполигонов.

burn_grass.index=burn_grass.UUID
fix = []
UUID_list = burn_grass.UUID.unique()
for i, id in enumerate(UUID_list):
    tmp = burn_grass[burn_grass['UUID']==id].geometry
    sh = MultiPolygon([x.buffer(0) for x in tmp.geometry])
    fix.append({'UUID': id, 'geometry':sh})
burn_grass = gpd.GeoDataFrame(fix, columns=['UUID', 'geometry'])
burn_grass = burn_grass.set_geometry('geometry')
burn_grass['geometry']=burn_grass.geometry.buffer(0)
burn_grass.crs = grid.crs    
person Karen Chen    schedule 16.01.2018