2011-09-23 21 views
8

Soy nuevo en Python. Estoy trabajando en archivos gps. Necesito convertir un archivo CSV que tenga todos los datos gps al archivo kml. A continuación se muestra el código en Python que estoy utilizando:Crear kml desde csv en Python

import csv 
#Input the file name. 
fname = raw_input("Enter file name WITHOUT extension: ") 
data = csv.reader(open(fname + '.csv'), delimiter = ',') 
#Skip the 1st header row. 
data.next() 
#Open the file to be written. 
f = open('csv2kml.kml', 'w') 

#Writing the kml file. 
f.write("<?xml version='1.0' encoding='UTF-8'?>\n") 
f.write("<kml xmlns='http://earth.google.com/kml/2.1'>\n") 
f.write("<Document>\n") 
f.write(" <name>" + fname + '.kml' +"</name>\n") 
for row in data: 
    f.write(" <Placemark>\n") 
    f.write("  <name>" + str(row[1]) + "</name>\n") 
    f.write("  <description>" + str(row[0]) + "</description>\n") 
    f.write("  <Point>\n") 
    f.write("   <coordinates>" + str(row[3]) + "," + str(row[2]) + "," + str(row[4]) + "</coordinates>\n") 
    f.write("  </Point>\n") 
    f.write(" </Placemark>\n") 
f.write("</Document>\n") 
f.write("</kml>\n") 
print "File Created. " 
print "Press ENTER to exit. " 
raw_input() 

el archivo CSV que estoy usando está disponible aquí: dip12Sep11newEdited.csv El archivo KML generado está disponible aquí: csv2kml.kml Pero el archivo KML no está siendo creado correctamente. Aparentemente después de algunas filas en el csv, el código no puede generar más Placemarks. No puede iterar. Puedes ver eso desplazándote a la última parte del archivo kml generado.

¿Alguien me puede ayudar a encontrar el error en el código, porque para algunos archivos csv más pequeños funcionó correctamente y creó archivos kml por completo.

Gracias.

+0

¿Cómo sabes que no puede generar más marcas de posición?(¿Alguna vez se solicitó 'Archivo creado'?) – KevinDTimm

+0

Sí, indica 'Archivo creído'. Pero si abre el archivo kml en el bloc de notas, verá que el archivo no se escribió por completo. – Darkpain

Respuesta

7

No respondió la consulta anterior, pero supongo que el error es que no está cerrando su archivo de salida (que se vaciaría) su salida).

f.close() 
+0

Si revisas el archivo kml puedes ver que ha terminado abruptamente. – Darkpain

+2

Ya era el problema. Acaba de agregar el f.close() y funcionó como un amuleto. Muchas gracias. – Darkpain

1

Thie simplekml paquete funciona muy bien, y hace fácil el trabajo de este tipo de cosas.

Para instalar en Ubuntu, descargue la última versión y ejecute lo siguiente desde el directorio que contiene el contenido del archivo.

sudo python setup.py install 

Hay también some tutorials para empezar.

0

Este código está bien escrito gracias por la publicación. Lo hice funcionar al colocar mi CSV en el mismo directorio que el código .py.

hice algunas modificaciones para llevarla a PY 3,3

import csv 
#Input the file name."JoeDupes3_forearth" 
fname = input("Enter file name WITHOUT extension: ") 
data = csv.reader(open(fname + '.csv'), delimiter = ',') 
#Skip the 1st header row. 
#data.next() 
#Open the file to be written. 
f = open('csv2kml.kml', 'w') 

#Writing the kml file. 
f.write("<?xml version='1.0' encoding='UTF-8'?>\n") 
f.write("<kml xmlns='http://earth.google.com/kml/2.1'>\n") 
f.write("<Document>\n") 
f.write(" <name>" + fname + '.kml' +"</name>\n") 
for row in data: 
    f.write(" <Placemark>\n") 
    f.write("  <name>" + str(row[1]) + "</name>\n") 
    f.write("  <description>" + str(row[3]) + "</description>\n") 
    f.write("  <Point>\n") 
    f.write("   <coordinates>" + str(row[10]) + "," + str(row[11]) + "," + str() + "</coordinates>\n") 
    f.write("  </Point>\n") 
    f.write(" </Placemark>\n") 
f.write("</Document>\n") 
f.write("</kml>\n") 
print ("File Created. ") 
print ("Press ENTER to exit. ") 
input() 
f.close() 

creo que sirve si está tratando de convertir sus datos.

1

Una respuesta menciona la "etree", una ventaja que no tiene que codificar el formato xml:

A continuación uno de mis ejemplos, por supuesto que hay que ajustarlo a su caso, pero puede conseguir el principio idea de cómo funciona la eTree:

para conseguir algo como esto

<OGRVRTDataSource> 
<OGRVRTLayer name="GW1AM2_201301010834_032D_L1SGRTBR_1110110_channel89H"> 
    <SrcDataSource>G:\AMSR\GW1AM2_201301010834_032D_L1SGRTBR_1110110_channel89H.csv</SrcDataSource> 
    <GeometryType>wkbPoint</GeometryType> 
    <GeometryField encoding="PointFromColumns" x="lon" y="lat" z="brightness" /> 
</OGRVRTLayer> 
</OGRVRTDataSource> 

puede utilizar este código:

import xml.etree.cElementTree as ET 
[....] 
root = ET.Element("OGRVRTDataSource") 

OGRVRTLayer  = ET.SubElement(root, "OGRVRTLayer") 
OGRVRTLayer.set("name", AMSRcsv_shortname) 

SrcDataSource = ET.SubElement(OGRVRTLayer, "SrcDataSource") 
SrcDataSource.text = AMSRcsv 

GeometryType = ET.SubElement(OGRVRTLayer, "GeometryType") 
GeometryType.text = "wkbPoint" 

GeometryField = ET.SubElement(OGRVRTLayer,"GeometryField") 
GeometryField.set("encoding", "PointFromColumns") 

GeometryField.set("x", "lon") 
GeometryField.set("y", "lat") 
GeometryField.set("z", "brightness") 

tree = ET.ElementTree(root) 
tree.write(AMSRcsv_vrt) 

también más información here

+0

Tenga en cuenta que hice una corrección en mi publicación para que sea más conciso. Cualquier elemento en el que solo esté configurando el texto o un solo atributo y no necesita mantener una referencia para agregar subelementos se puede hacer en una sola línea. Por ejemplo: 'ET.SubElement (OGRVRTLayer," GeometryType "). Text =" wkbPoint "' – ssokolow