Saltar al contenido

¿Está buscando una herramienta para generar malla a partir de DTM?

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 de Export 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 usando python 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 resultado crater_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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *