2011-09-23 92 views
8

我是Python新手。我正在處理gps文件。我需要將所有gps數據的CSV文件轉換爲kml文件。以下是在Python代碼我使用:從Python中的csv創建kml

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

我使用CSV文件,請訪問:dip12Sep11newEdited.csv 生成的KML文件可以在這裏找到:csv2kml.kml 但沒有得到正確創建KML文件。顯然,在csv中的一些行後,代碼無法生成更多地標。它無法迭代。您可以通過滾動到生成的kml文件的最後一部分來看到。

任何人都可以幫助我找出代碼中的錯誤,因爲對於一些較小的csv文件,它可以正常工作並完全創建kml文件。

謝謝。

+0

你怎麼知道它無法生成更多的地標?(它是否曾提示「創建文件」?) – KevinDTimm

+0

是的,它會提示'文件已被創建'。但是,如果您在記事本中打開kml文件,則可以看到該文件沒有完全寫入。 – Darkpain

回答

7

你還沒回答上面的查詢,但我的猜測是錯誤的,你不關閉你的輸出文件(這將刷新你的輸出)。

f.close() 
+0

如果你檢查kml文件,你可以看到它突然結束。 – Darkpain

+2

雅這是問題。只需添加f.close(),它就像一個魅力。非常感謝。 – Darkpain

1

thie simplekml包工作得很好,並使得這種事情變得容易。

要在Ubuntu上安裝,請下載最新版本,並從包含存檔內容的目錄運行以下命令。

sudo python setup.py install 

也有some tutorials讓你開始。

0

此代碼寫得很好謝謝你的帖子。我通過將我的CSV與.py代碼放在同一個目錄中來實現它。

我做了一些修改,以使其以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() 

希望它可以幫助,如果你想你的數據轉換。

1

一個答案提到"etree",一個優點是,你不必硬編碼XML格式:

下面的我的一個例子,當然你必須把它調整到你的情況,但你可能會原則如何etree作品的想法:

得到這樣的事情

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

您可以使用此代碼:

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) 

也有一些更多信息here

+0

請注意,我在文章中進行了更正,以使其更加簡潔。只需設置文本或單個屬性並且不需要保存添加子元素的引用的任何元素都可以在一行中完成。例如:'ET.SubElement(OGRVRTLayer,「GeometryType」)。text =「wkbPoint」' – ssokolow