from gvsig import * from geom import * ''' Script para convertir capas de polígonos a líneas y viceversa. Tiene por objeto la conversión de una capa de polígonos a otra de líneas y viceversa conservando, además de las formas geométricas, los valores de la tabla de atributos original. Para ejecutarlo correctamente, el usuario debe tener seleccionada la capa a convertir en la vista, especificar en la ruta de salida en la línea 40 del código fuente y el tipo de geometria de destino en la 41. Autor: Dr. D. Santos Fernandez Noguerol Pagina web: http://gistools.es/ ''' # Funcion para crea la nueva capa en función del tipo de geometria def crear_nueva_capa(nueva_esquema, nueva_ruta, CRS, tipo_geometria): if tipo_geometria == "poligono": nueva = createShape(nueva_esquema, nueva_ruta, CRS = CRS, geometryType = POLYGON) return nueva elif tipo_geometria == "linea": nueva = createShape(nueva_esquema, nueva_ruta, CRS = CRS, geometryType = LINE) return nueva else: print "Error, la geometria es incorrecta" # Funcion para crear las geometrias de la nueva capa en función del tipo de geometria def crear_nueva_geometria(tipo_geometria): if tipo_geometria == "poligono": nueva = createGeometry(POLYGON) return nueva elif tipo_geometria == "linea": nueva = createGeometry(LINE) return nueva else: print "Error, la geometria es incorrecta" def main(*args): #Ruta y geometria de salida (a cambiar por el usuario) nueva_ruta = r"T:/Temp/gvSIG/proyecto/capa_convertida.shp" geometria_final = "linea" #Indicar literalmente "linea" o "poligono" original_capa = currentLayer() original_esquema = original_capa.getSchema() nueva_esquema = createSchema(original_esquema) CRS = currentView().getProjection() nueva_capa = crear_nueva_capa(nueva_esquema, nueva_ruta, CRS, geometria_final) #Inicio de la edicion de la capa nueva nueva_capa.edit() #Recorrido de las entidades originales for original_entidad in original_capa.features(): #Se almacena el número de vertices de la entidad original para iterar sus vertices num_vertices = original_entidad.geometry().getNumVertices() #Se crea la entidad nueva de la nueva capa nueva_linea = crear_nueva_geometria(geometria_final) '''Volcado de vertices, se recuerda el primer vertice para no dejar un segmento sin cubrir entre el último y el primero de la entidad.''' primer_vertice = createGeometry(POINT) for i in range(0, num_vertices): vertice = original_entidad.geometry().getVertex(i) #Se recogen los valores del primer vertice if (i == 0): primer_vertice.setX(vertice.getX()) primer_vertice.setY(vertice.getY()) #Se añaden los vertices a la nueva entidad nueva_linea.addVertex(createPoint(vertice.getX(), vertice.getY())) '''Tras añadir todos los vertices, se vuelve añadir al final de la coleccion el primero para evitar que exista un "segmento vacio" que no complete el políogono original''' nueva_linea.addVertex(primer_vertice) #Se añade la nueva entidad y los atributos a la capa nueva nueva_atributos = original_entidad.getValues() #Se toman los atributos orignales nueva_atributos['GEOMETRY'] = nueva_linea #Se vuelva la nueva geometría nueva_capa.append(nueva_atributos) #Se añaden la geometria y los atributos a la nueva tabla #Se cierra la edición nueva_capa.commit() #Se añade la nueva capa a la vista currentView().addLayer(nueva_capa)