【问题标题】:Create kml from csv in Python在 Python 中从 csv 创建 kml
【发布时间】:2023-03-05 01:04:01
【问题描述】:

我是 Python 新手。我正在处理 gps 文件。我需要将包含所有 gps 数据的 CSV 文件转换为 kml 文件。下面是我正在使用的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()

我使用的 csv 文件可以在这里找到:dip12Sep11newEdited.csv 生成的 kml 文件可在此处获得:csv2kml.kml 但是没有正确创建 kml 文件。显然,在 csv 中的某些行之后,代码无法生成更多地标。它无法迭代。您可以通过滚动到生成的 kml 文件的最后部分来查看。

谁能帮我找出代码中的错误,因为对于一些较小的 csv 文件,它可以正常工作并完全创建 kml 文件。

谢谢。

【问题讨论】:

  • 你怎么知道它不能生成更多的地标? (它是否曾提示“文件已创建”?)
  • 是的,它会提示“文件已创建”。但是如果你在记事本中打开kml文件,你可以看到文件没有完全写入。

标签: python csv gps kml google-earth


【解决方案1】:

您没有回答上面的查询,但我猜错误是您没有关闭输出文件(这会刷新您的输出)。

f.close()

【讨论】:

  • 如果您检查 kml 文件,您会发现它突然结束了。
  • 是的,这是问题所在。刚刚添加了 f.close() ,它就像一个魅力。非常感谢。
【解决方案2】:

使用 etree 创建文件

http://docs.python.org/library/xml.etree.elementtree.html

它包含在 Python 中,可防止您生成损坏的 XML。 (例如,因为fname 包含&amp;,这在XML 中有特殊含义。)

【讨论】:

    【解决方案3】:

    这段代码写得很好,谢谢你的帖子。我通过将我的 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()
    

    希望对您尝试转换数据有所帮助。

    【讨论】:

      【解决方案4】:

      一个答案提到了"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

      【讨论】:

      • 请注意,我在帖子中进行了更正以使其更简洁。您只需设置文本或单个属性并且不需要保留用于添加子元素的引用的任何元素都可以在一行中完成。例如:ET.SubElement(OGRVRTLayer, "GeometryType").text = "wkbPoint"
      【解决方案5】:

      simplekml 包运行良好,可以轻松处理此类事情。

      要在 Ubuntu 上安装,请下载最新版本并从包含存档内容的目录中运行以下命令。

      sudo python setup.py install
      

      还有some tutorials 可以帮助您入门。

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 2013-12-02
        • 2013-08-15
        • 2021-04-17
        • 2021-05-15
        • 1970-01-01
        相关资源
        最近更新 更多