1 votos

¿Cambiar el código de Python para importar solamente puntos de los archivos DXF (o solamente importar líneas)?

Editar - Este código ya no funciona en la nueva versión de QGIS (QGIS 3.0) Si lo pego en la consola de python, genera una serie de solicitudes para el CRS pero luego no importa nada. QGIS 3.0 se ha trasladado a una versión más nueva de Python y el código que tengo es incompatible.

¿Cómo lo edito para que funcione de nuevo?

Pregunta original:

Acabo de fusionar varios cientos de capas en QGIS que se habían importado usando este código:-

import glob, os
path = "H:/aOsmap/Miltkeyn/2012 ntfs/all/"
for layer in glob.glob(path + "*.dxf"):
    vlayer = QgsVectorLayer(layer, 'name', 'ogr')
    subLayers = vlayer.dataProvider().subLayers()
    for subLayer in subLayers:
        geom_type = subLayer.split(':')[-1]
        uri = "%s|layername=entities|geometrytype=%s" % (layer, geom_type,)
        dfx_file_name = os.path.splitext(os.path.basename(layer))[0]
        layer_name = "%s - %s" % (dfx_file_name,geom_type,)
        sub_vlayer = QgsVectorLayer(uri, layer_name, 'ogr')
        QgsMapLayerRegistry.instance().addMapLayer(sub_vlayer)

La fusión fue difícil porque la ventana de fusión (vector-combinar capas) mezcla las capas de líneas y las capas de puntos, por lo que seleccionar solo las capas de puntos o solo las capas de líneas, entre más de 600 capas, es laborioso y propenso a hacer clic en la capa incorrecta.

Sería más fácil y rápido importar todos los puntos de mis dxfs de una vez y fusionarlos (guardando el archivo fusionado) y luego importar todas las líneas de los dxfs y fusionarlas.

Sin embargo, no entiendo el código así que no tengo idea de qué cambiar para seleccionar solo puntos o solo líneas.

¿Alguien puede ayudarme?

2voto

Mue Puntos 2469

Puedes agregar una declaración if para permitir solo ciertos tipos de geom_type para ser importados. Justo después de la línea geom_type = subLayer.split(':')[-1] agrega:

  • Para puntos:

    if geom_type == 'Point':
  • Para líneas:

    if geom_type == 'LineString':

Ejemplo:

import glob, os
path = "H:/aOsmap/Miltkeyn/2012 ntfs/all/"
for layer in glob.glob(path + "*.dxf"):
    vlayer = QgsVectorLayer(layer, 'name', 'ogr')
    subLayers = vlayer.dataProvider().subLayers()
    for subLayer in subLayers:
        geom_type = subLayer.split(':')[-1]
        # Aquí podemos agregar la declaración if
        if geom_type == 'Point':
            uri = "%s|layername=entities|geometrytype=%s" % (layer, geom_type,)
            dfx_file_name = os.path.splitext(os.path.basename(layer))[0]
            layer_name = "%s - %s" % (dfx_file_name,geom_type,)
            sub_vlayer = QgsVectorLayer(uri, layer_name, 'ogr')
            QgsMapLayerRegistry.instance().addMapLayer(sub_vlayer)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X