2011-09-23 93 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