pythongeojsongeopandascaddxf

Convert linestring to polygon of geojson file in Geopandas


I have the following CAD file in dxf format which display in autocad looking like: enter image description here

I convert it to geojson format file named test.geojson with GDAL org2org but all in type: LineString

{
"type": "FeatureCollection",
"name": "entities",
"features": [
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 30.0, 0.0 ], [ 30.0, 9.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 16.0, 47.0 ], [ 16.0, 34.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 16.0, 13.0 ], [ 16.0, 0.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 0.0, 31.0 ], [ 9.0, 31.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 30.0, 31.0 ], [ 39.0, 31.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 0.0, 23.0 ], [ 9.0, 23.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 30.0, 23.0 ], [ 39.0, 23.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 0.0, 16.0 ], [ 9.0, 16.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 30.0, 16.0 ], [ 39.0, 16.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 0.0, 0.0 ], [ 39.0, 0.0 ], [ 39.0, 47.0 ], [ 0.0, 47.0 ], [ 0.0, 0.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 9.0, 38.0 ], [ 11.0, 38.0 ], [ 11.0, 34.0 ], [ 28.0, 34.0 ], [ 28.0, 38.0 ], [ 30.0, 38.0 ], [ 30.0, 9.0 ], [ 28.0, 9.0 ], [ 28.0, 13.0 ], [ 11.0, 13.0 ], [ 11.0, 9.0 ], [ 9.0, 9.0 ], [ 9.0, 38.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 11.0, 32.0 ], [ 17.0, 32.0 ], [ 17.0, 15.0 ], [ 11.0, 15.0 ], [ 11.0, 32.0 ] ] } },
{ "type": "Feature", "properties": { "Layer": "0" }, "geometry": { "type": "LineString", "coordinates": [ [ 20.0, 32.0 ], [ 28.0, 32.0 ], [ 28.0, 15.0 ], [ 20.0, 15.0 ], [ 20.0, 32.0 ] ] } }
]
}

I want to convert it to type: polygon with display as follow image showing: enter image description here

How can I do that in Geopandas? Thanks.

BTW, I read test.geojson file, it looks like:

import geopandas as gpd
df = gpd.read_file("test.geojson")
df.head(5)

Output:

  Layer               SubClasses EntityHandle                                           geometry
0     0  AcDbEntity:AcDbPolyline          106  LINESTRING (30.35270412013777 0.79246615687498...
1     0  AcDbEntity:AcDbPolyline          107  LINESTRING (16.16520412013776 47.1049661568749...
2     0  AcDbEntity:AcDbPolyline          108  LINESTRING (16.16520412013776 13.4799661568749...
3     0  AcDbEntity:AcDbPolyline          109  LINESTRING (0.665204120137787 31.2924661568749...
4     0  AcDbEntity:AcDbPolyline          10A  LINESTRING (30.35270412013777 31.2924661568749...

Solution

  • Dissolve the lines into a multiline then polygonize:

    import geopandas as gpd
    from shapely.ops import polygonize
    
    df = gpd.read_file(r"C:\Users\bera\Desktop\gistest\data.geojson")
    
    multiline = df.dissolve() #Dissolve all lines into one multiline
    polygons = list(polygonize(multiline.iloc[0].geometry)) #Polygonize it
    
    df2 = gpd.GeoDataFrame(geometry=polygons) #Create a geodataframe from the list of polygons
    df2["id"] = range(df2.shape[0]) #Give each polygon a unique id
    
    #Plot
    ax = df2.plot(zorder=1, column="id", cmap="tab20")
    df.plot(ax=ax, zorder=2, color="black")
    

    enter image description here