From_KMZ_To_GeoJson
Fri Sep 29 2023 13:22:27 GMT+0000 (Coordinated Universal Time)
Saved by @leandrorbc #python
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')



Comments