from shapely.geometry import * import glob from zipfile import ZipFile import pandas as pd import io import geopandas as gpd from fastkml import kml import shapely def remove_third_dimension(geom): if geom.is_empty: return geom if isinstance(geom, Polygon): exterior = geom.exterior new_exterior = remove_third_dimension(exterior) interiors = geom.interiors new_interiors = [] for int in interiors: new_interiors.append(remove_third_dimension(int)) return Polygon(new_exterior, new_interiors) elif isinstance(geom, LinearRing): return LinearRing([xy[0:2] for xy in list(geom.coords)]) elif isinstance(geom, LineString): return LineString([xy[0:2] for xy in list(geom.coords)]) elif isinstance(geom, Point): return Point([xy[0:2] for xy in list(geom.coords)]) elif isinstance(geom, MultiPoint): points = list(geom.geoms) new_points = [] for point in points: new_points.append(remove_third_dimension(point)) return MultiPoint(new_points) elif isinstance(geom, MultiLineString): lines = list(geom.geoms) new_lines = [] for line in lines: new_lines.append(remove_third_dimension(line)) return MultiLineString(new_lines) elif isinstance(geom, MultiPolygon): pols = list(geom.geoms) new_pols = [] for pol in pols: new_pols.append(remove_third_dimension(pol)) return MultiPolygon(new_pols) elif isinstance(geom, GeometryCollection): geoms = list(geom.geoms) new_geoms = [] for geom in geoms: new_geoms.append(remove_third_dimension(geom)) return GeometryCollection(new_geoms) else: raise RuntimeError("Currently this type of geometry is not supported: {}".format(type(geom))) outDir = '/Users/agroclimate/Documents/PriceFrobes/Uruguay/Poligonos/GeoJson/2023/' files = glob.glob('/Users/agroclimate/Documents/PriceFrobes/Uruguay/Poligonos/KMZ 2023/**/*.kmz', recursive=True) for file in files: print(file) kmz = ZipFile(file, 'r') kml_content = kmz.open('doc.kml', 'r').read() k = kml.KML() k.from_string(kml_content) docs = list(k.features()) folders = [] for d in docs: folders.extend(list(d.features())) records = [] while type(folders[0]) is not type(kml.Placemark('{http://www.opengis.net/kml/2.2}', 'id', 'name', 'description')): records = [] for f in folders: records.extend(list(f.features())) folders = records names = [element.name for element in folders] geoms = [element.geometry for element in folders] file_name = os.path.basename(file)[:-4] for (geom, name) in zip(geoms, names): geom = remove_third_dimension(geom) gdf = gpd.GeoDataFrame(index=[0], crs='epsg:4326', geometry=[geom]) gdf.to_file(outDir+file_name+ "_"+name+'.geojson', driver='GeoJSON')
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter