I am trying to run a loop using my large and small polygon file, however, I experience a RuntimeError:
RuntimeError: GDAL Error: Attempt to write non-polygon (LINESTRING) geometry to POLYGON type shapefile. Failed to write record: {'id': '11416', 'type': 'Feature', 'properties': {'FIDi': 1191, 'ID': 11416}, 'geometry': {'type': 'GeometryCollection', 'geometries': [{'type': 'LineString', 'coordinates': ((55081...))
The loop looks something like this and what I try to do, is go through the large polygons, find each small polygon within and calculate the area. The result is a shapefile with small polygons. However, when I try to export the file as a shapefile (appended_concat.to_file(r'E:\...\result.shp'
) I got the error above. When I export as GPKG, everything works. I was pretty sure that polygon geometry is either POLYGON
or MULTIPOLYGON
, but cannot understand why I got GEOMETRYCOLLECTION
.
import geopandas as gpd
import pandas as pd
large = gpd.read_file(r'E:\...\Polygons.shp')
small = gpd.read_file(r'E:\...\Small_polygon.shp')
points = gpd.read_file(r'E:\...\points.shp')
# check if there are any invalid geometries
list = [large, small, points]
for n in list:
valid_gdf = n[~n.geometry.is_valid]
print(n.shape)
print(valid_gdf.shape)
(19726, 3)
(0, 3)
(2415, 285)
(0, 285)
(1096029, 5)
(0, 5)
appended = []
for i in large.index:
df = small[small['FID'] == i]
df_result = gpd.overlay(large, df, how='intersection')
df_result['area'] = round(df_result.area / 10000, 4)
df_result_2 = df_result[df_result['FID'] == i]
print(df_result_2)
appended.append(small)
appended_concat = pd.concat(appended)
appended_concat.to_file(r'E:\...\result.shp')
appended_concat.to_file(r'E:\...\result.gpkg', driver='GPKG')
And when I import the GPKG file into QGIS, I can see that some of the polygons are GeometryCollection.
How can I transform to polygon or somehow correct the GeometryCollection figures?
Technically, I could just use the GPKG file format which does not cause the error. However, I would like to understand why I cannot export a shapefile and why the GeometryCollection figures appears in general?