He leído un archivo LAS. Si lo importo en Global Mapper dice la proyección, sin embargo cuando lo leo con laspy (header.proj_id_1) no hay información asociada. He editado las coordenadas y he actualizado los valores X,Y,Z a nuevos valores (según este ) para el archivo LAS y ahora me gustaría dar una nueva proyección después de actualizar las coordenadas. ¿Qué función debo utilizar?
Respuesta
¿Demasiados anuncios?Encontré un minuto para investigar esto. No sabemos muy bien lo que su archivo específico contiene, pero aquí es una manera rápida y sucia para actualizar el GeoKeyDirectoryTag
VLR ( página 11 ) utilizando los valores descritos en el especificación geotiff .
Esto sí no actualmente cuenta con el almacenamiento de los parámetros de proyección individuales en un GeoDoubleParamsTag
o GeoAsciiParamsTag
registro. No tengo ningún dato de ejemplo a mano que contenga esos parámetros, así que si necesitas ayuda para ampliar esto, podría necesitar que publicaras algo para mí.
Esto actualiza el archivo en el lugar, por lo que se advierte.
import laspy
src_path = r"C:\example\test.las"
# see here for possible values:
# http://geotiff.maptools.org/spec/geotiff2.7.html
replace_keys = {
3072: 26912, # set ProjectedCSTypeGeoKey to NAD83 / UTM 12N
3076: 9001, # set ProjLinearUnitsGeoKey to meters
4099: 9001 # set VerticalUnitsGeoKey to meters
}
def update_geo_keys(path, lookup):
with laspy.file.File(path, mode='rw') as f:
for i, vlr in enumerate(f.header.vlrs):
# search for the GeoKeyDirectoryTag record
if vlr.record_id != 34735:
continue
modified_body = []
j = 0
# loop over geo key entries, stored in groups of 4 values
while j < len(vlr.parsed_body):
key_id, tag_loc, count, value = vlr.parsed_body[j:j+4]
if j > 0 and tag_loc != 0:
raise NotImplementedError('modification of projection '
'parameters not implemented')
# update the value for this key ID, if necessary
try:
value = lookup[key_id]
except KeyError:
pass
# maintain a new list of values to be written
modified_body.extend((key_id, tag_loc, count, value))
j += 4
# update the vlr with our new values, quit searching
vlr.parsed_body = modified_body
break
else:
raise ValueError('no GeoKeyDirectoryTag found in file')
f.header.save_vlrs()
update_geo_keys(src_path, replace_keys)