def extract_metadata_pdal(filepath: str):
r = pdal.Reader.copc(filepath)
i = pdal.Filter.info()
pipeline: pdal.Pipeline = r | i
count = pipeline.execute()
info = pipeline.metadata['metadata'][i.type]
try:
bbox_info = info['bbox']
bbox =[
bbox_info['minx'], bbox_info['miny'], bbox_info['minz'],
bbox_info['maxx'], bbox_info['maxy'], bbox_info['maxz']
]
srs_code = None
if (info.get('srs') and
info['srs'].get('json') and
info['srs']['json'].get('id') and
info['srs']['json']['id'].get('code')):
srs_code = info['srs']['json']['id']['code']
if srs_code and srs_code != "":
transformer = Transformer.from_crs(f"EPSG:{srs_code}", "EPSG:4326", always_xy=True)
min_lon, min_lat = transformer.transform(bbox_info['minx'], bbox_info['miny'])
max_lon, max_lat = transformer.transform(bbox_info['maxx'], bbox_info['maxy'])
# bbox in WGS84
polygon = box(min_lon, min_lat, max_lon, max_lat)
geom = mapping(polygon)
else:
polygon = box(bbox_info['minx'], bbox_info['miny'], bbox_info['maxx'], bbox_info['maxy'])
geom = mapping(polygon)
point_count = info['num_points']
except KeyError as e:
print(f"KeyError: {e}")
srs_code = None
bbox = [0, 0, 0, 0] # Default bbox
geom = mapping(box(0, 0, 0, 0)) # Default geometry
point_count = 0
return {
"crs": f"EPSG:{srs_code}" if srs_code else None,
"bbox": bbox,
"geometry": geom,
"point_count": point_count,
}