2011-09-23 11 views
8

Sono nuovo di Python. Sto lavorando su file gps. Devo convertire un file CSV con tutti i dati gps nel file kml. Di seguito è riportato il codice in python che sto usando:Creare kml da csv in 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() 

il file CSV che sto usando è disponibile qui: dip12Sep11newEdited.csv Il file KML generato è disponibile qui: csv2kml.kml Ma il file KML non è sempre creata correttamente. Apparentemente dopo alcune righe nel csv il codice non è in grado di generare più segnaposto. Non è in grado di scorrere. Lo puoi vedere scorrendo fino all'ultima parte del file kml generato.

Qualcuno può aiutarmi a scoprire l'errore nel codice, perché per alcuni file csv più piccoli ha funzionato correttamente e ha creato i file kml completamente.

Grazie.

+0

Come fai a sapere che non è in grado di generare più segnaposto?(Viene mai richiesto "File creato"?) – KevinDTimm

+0

Sì, viene visualizzato il messaggio "File crittografato". Ma se apri il file kml nel blocco note, puoi vedere che il file non ha scritto completamente. – Darkpain

risposta

7

Non hai risposto alla query sopra, ma la mia ipotesi è che l'errore è che non stai chiudendo il file di output (che svuoterebbe la tua produzione).

f.close() 
+0

Se si controlla il file kml, si può vedere che si è interrotto bruscamente. – Darkpain

+2

Ya era il problema. Ho appena aggiunto f.close() e ha funzionato come un incantesimo. Molte grazie. – Darkpain

1

pacchetto Thie simplekml funziona molto bene, e rende facile il lavoro di queste cose.

Per installare su Ubuntu, scaricare la versione più recente ed eseguire quanto segue dalla directory che contiene il contenuto dell'archivio.

sudo python setup.py install 

Ci sono anche some tutorials per iniziare.

0

Questo codice è ben scritto grazie per il post. L'ho fatto funzionare mettendo il mio CSV nella stessa directory del codice .py.

Ho fatto un paio di modifiche per portarla nel 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() 

speriamo vi sia utile se si sta cercando di convertire i dati.

1

Una risposta cita il "etree", un vantaggio che non è necessario codificare il formato xml:

Qui di seguito uno dei miei esempi, ovviamente è necessario regolare al vostro caso, ma si può ottenere il principio idea di opere come eTree:

per ottenere qualcosa di simile

<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> 

è possibile utilizzare questo codice:

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) 

anche qualche info in più here

+0

Nota che ho apportato una correzione nel mio post per renderlo più conciso. Qualsiasi elemento in cui si sta semplicemente impostando il testo o un singolo attributo e non è necessario mantenere un riferimento per l'aggiunta di sottoelementi può essere fatto in una singola riga. Ad esempio: 'ET.SubElement (OGRVRTLayer," GeometryType "). Text =" wkbPoint "' – ssokolow