Nuestro grupo de especialistas pasados muchos días de investigación y de recopilar de información, hemos dado con la solución, nuestro deseo es que todo este artículo sea de gran utilidad para tu proyecto.
Solución:
Un ráster DTM se puede representar mediante mallas triangulares al encontrar un conjunto de triángulos no superpuestos que cubra toda la malla y se aproxime al campo de elevación. Hay dos tipos diferentes de mallas triangulares que se pueden utilizar para este propósito:
- una red regular triangulada (TRN), en el que cada píxel del ráster está representado por un vértice y todos los triángulos tienen el mismo tamaño y forma. Toda la información original del ráster DTM está presente en el TRN, pero la memoria necesaria para almacenar la malla suele ser bastante alta.
- una red irregular trianguladaESTAÑO), en el que hay menos vértices que píxeles ráster y los triángulos tienen diferentes formas y tamaños. Los vértices y la triangulación se eligen de tal manera que la superficie resultante se aproxime al ráster DTM original hasta un error especificado. Por lo general, esto da como resultado archivos mucho más pequeños, ya que las áreas planas o casi planas se pueden representar utilizando solo un par de vértices.
En la mayoría de las aplicaciones, si necesita lidiar con mallas de elevación, optaría por un TIN, ya que arrojar información redundante o casi redundante permite cálculos más eficientes. Sin embargo, crear TIN a partir de rásteres no es sencillo, ya que hay muchas triangulaciones diferentes que se aproximan a una cuadrícula con el mismo error, pero usando diferentes conjuntos de vértices.
Software para crear TIN
- El software Terra de Michael Garland.
- ArcGIS:
Raster to TIN
función de la caja de herramientas de 3D Analyst. - SAGA GIS:
Grid to TIN (Surface Specific Points)
función, seguida deExport TIN to Stereo Lithography File (STL)
función para exportar el TIN a un formato de malla legible por Meshlab.
Software para crear TRN
- VTBuilder, que es parte del Proyecto de terreno virtual: cargue el ráster DTM usando “Layer | Import Layer” y luego conviértalo en un TRN usando “Elevation | Convert grid to TIN”. Luego, seleccione la capa recién generada en la vista general de capas y seleccione “Elevación | Exportar a …”. VTBuilder puede leer todos los formatos ráster que admite GDAL y exporta TRN a formatos OBJ, PLY, GMS, DXF, DAE o WRL.
- SAGA GIS:
Grid to TIN
función. -
Desarrolle su propia solución: implementarla no es particularmente difícil. Aquí hay un script de Python que usa la biblioteca GDAL para leer un DTM ráster y luego escribe una malla PLY binaria.
Guarde el script como
gdal_rastertotrn.py
, luego llámalo usandopython gdal_rastertotrn.py
.He aquí un ejemplo. Conversión de un DTM ráster de Crater Lake llamado
crater_lake.tif
…… llamando
python gdal_rastertotrn.py crater_lake.tif crater_lake.ply
, y abriendo el resultadocrater_lake.ply
en Meshlab:Aquí está el guión (sin pulir). Dado que utiliza la biblioteca GDAL, puede convertir todos los tipos de ráster admitidos por GDAL. Solo escribe archivos PLY.
#!/usr/bin/python import sys import numpy as np from osgeo import gdal def write_ply(filename, coordinates, triangles, binary=True): template = "plyn" if binary: template += "format binary_" + sys.byteorder + "_endian 1.0n" else: template += "format ascii 1.0n" template += """element vertex nvertices:n property float x property float y property float z element face nfaces:n property list int int vertex_index end_header """ context = "nvertices": len(coordinates), "nfaces": len(triangles) if binary: with open(filename,'wb') as outfile: outfile.write(template.format(**context)) coordinates = np.array(coordinates, dtype="float32") coordinates.tofile(outfile) triangles = np.hstack((np.ones([len(triangles),1], dtype="int") * 3, triangles)) triangles = np.array(triangles, dtype="int32") triangles.tofile(outfile) else: with open(filename,'w') as outfile: outfile.write(template.format(**context)) np.savetxt(outfile, coordinates, fmt="%.3f") np.savetxt(outfile, triangles, fmt="3 %i %i %i") def readraster(filename): raster = gdal.Open(filename) return raster def createvertexarray(raster): transform = raster.GetGeoTransform() width = raster.RasterXSize height = raster.RasterYSize x = np.arange(0, width) * transform[1] + transform[0] y = np.arange(0, height) * transform[5] + transform[3] xx, yy = np.meshgrid(x, y) zz = raster.ReadAsArray() vertices = np.vstack((xx,yy,zz)).reshape([3, -1]).transpose() return vertices def createindexarray(raster): width = raster.RasterXSize height = raster.RasterYSize ai = np.arange(0, width - 1) aj = np.arange(0, height - 1) aii, ajj = np.meshgrid(ai, aj) a = aii + ajj * width a = a.flatten() tria = np.vstack((a, a + width, a + width + 1, a, a + width + 1, a + 1)) tria = np.transpose(tria).reshape([-1, 3]) return tria def main(argv): inputfile = argv[0] outputfile = argv[1] raster = readraster(inputfile) vertices = createvertexarray(raster) triangles = createindexarray(raster) write_ply(outputfile, vertices, triangles, binary=True) if __name__ == "__main__": main(sys.argv[1:])
Acabamos de crear un proyecto de código abierto que le ayudará a hacer exactamente lo que quiere. Tin-Terrain es una herramienta de línea de comando simple que generará una malla a partir de archivos DEM como TIN o TRN.
La salida se puede guardar como archivo .obj, por lo que se puede arrastrar y soltar directamente en meshlab. También admitirá el mosaico con niveles de zoom en formato de malla cuantificada.
Tienes la opción de añadir valor a nuestro contenido tributando tu veteranía en las reseñas.