4 votos

QGIS importar polígonos en CSV

QGIS 1.8 en Mac: Estoy esperando para migrar varias docenas de mapas locales de mi 30 años de edad Win3.1 sistema de trazado a QGIS. Los polígonos están en X,Y (CSV), primer punto repetido al final para cerrarlo, con polígonos separados por una línea en blanco. Cada uno está en coordenadas locales (metros desde una esquina). Puedo transformar a UTM y reemplazar el delimitador de polígono por otra cosa si es necesario, pero sería más fácil no tener que hacerlo.

El formato es el siguiente

10,10
20,20
20,30
10,10

5,5
5,6
6,5
5,5

He intentado Importar como capa de texto: la tabla de atributos muestra los valores correctamente, pero cada coordenada sólo se muestra como un punto, las líneas separadoras de polígonos se omiten y la capa no se puede editar. He intentado exportarla como capa vectorial como http://maps.cga.harvard.edu/qgis/wkshop/import_csv.php sugiere- la exportación falla. No puedo encontrar el mmqgis mencionado en varios posts aquí; el plugin Points2One no hace nada.

¿Alguna sugerencia?

1voto

Nick Puntos 3115

Tendrá que formatear los datos para convertirlos en polígonos. Etiquetar simplemente un campo como WKT no le ayudará. Si tiene muchos archivos (como parece), lo más eficaz será automatizar la solución escribiendo un script.

Iba a explicar cómo cuando decidí que lo más sencillo sería escribir un script de ejemplo (¡disculpad si os estoy enseñando a chupar huevos!):

import os
csvFolder = r"C:\myFolder\mySubFolder"

#----------------------------------------
def writePolyToFile(outFile, polygon, polyId):
    wkt = "POLYGON((" + ','.join(polygon) + "))\n"
    outFile.write(str(polyId) + ';' + wkt)

def makePolys(inPath, outPath):
    try:
        with open(inPath,'r') as inFile:
            contents = inFile.readlines()
            polyId = 0
            polygon = []

            for line in contents:
                line = line.rstrip('\n')
                if polyId == 0:

                    if line != 'x,y':
                        print("Unexpected file contents detected in", inPath)
                        break

                    outFile = open(outPath,'w')
                    outFile.write("id;wkt\n")
                    polyId += 1

                elif len(line) == 0:
                    writePolyToFile(outFile, polygon, polyId)
                    polygon = []
                    polyId += 1

                else:
                    polygon.append(line.replace(',',' '))

        writePolyToFile(outFile, polygon, polyId) #append the last polygon after EOF
        outFile.close()
        print('Conversion to WKT OK for', inPath)

    except:
        print('WARNING: conversion to WKT failed for', inPath)

def iterateFiles():
    csvFiles = [each for each in os.listdir(csvFolder) if each.endswith('.csv')]

    for file in csvFiles:
        inPath = os.path.join(csvFolder, file)
        newName = "WKT_" + file
        outPath = os.path.join(csvFolder, newName)
        makePolys(inPath, outPath)
#---------------------------------------------

if __name__ == "__main__":
    iterateFiles()

Este es un script Python muy simple que iterará sobre una carpeta de archivos CSV como un proceso por lotes. Comprueba de forma lógica que la primera línea del archivo sigue el formato 'x,y'. A continuación, recoge todos los puntos en una matriz hasta que encuentra una línea en blanco y refunde la matriz como una cadena WKT que se escribe en un archivo de salida del mismo nombre que el original, pero con el prefijo 'WKT_' (por lo que 'primerArchivo.csv' se exporta a 'WKT_primerArchivo.csv' conservando el archivo original).

Cambie la línea siguiente csvCarpeta = r" C:\myFolder\mySubFolder " para que apunte a una carpeta que contenga todos los archivos CSV que desee convertir (¡asegúrese de mantener la 'r' al principio de la ruta!).

Ahora puede abrir los archivos resultantes utilizando el cuadro de diálogo normal "Añadir capa vectorial" en lugar del cuadro de diálogo "Añadir texto delimitado".

EDITAR
He aquí una muestra de mi prueba:
Entrada:

x,y
10,10
20,20
20,30
10,10

5,5
5,6
6,5
5,5

15,15
30,30
30,40
15,15

Salida:

id;wkt
1;POLYGON((10 10,20 20,20 30,10 10))
2;POLYGON((5 5,5 6,6 5,5 5))
3;POLYGON((15 15,30 30,30 40,15 15))

0voto

Michael Burr Puntos 181287

QGIS cargará un CSV espacial sin problemas si incluye un campo llamado "WKT" con las coordenadas. Asegúrese de que la geometría sigue la sintaxis adecuada http://en.wikipedia.org/wiki/Well-known_text .

Abra primero su archivo CSV en una hoja de cálculo para asegurarse de que no hay filas con espacios en blanco o nulos en el campo WKT, y que cada representación es un WKT válido; si no, elimine esa fila.

simplemente cargue ese archivo .CSV en QGIS 1.8 como un archivo, cambiando el tipo de shapefile etc. a formato CSV

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