Растворение 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: входной геом 1 недопустим: самопересечение в точке 130.94262695312494 -19.395507812500028 или около нее в точке 130.94262695312494 -19.395507812500028 pandas/_libs/src\redu.pyx в pandas._libs.lib._resresult()
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