【问题标题】:Creating a KML linestring from a CSV with Python and simplekml使用 Python 和 simplekml 从 CSV 创建 KML 线串
【发布时间】:2017-08-30 23:07:50
【问题描述】:

我有一堆 CSV 文件,其中包含纬度和经度等字段。每一行都是旅程中的一个点。我正在尝试创建一个将旅程显示为线串的 KML,但无法完全弄清楚如何将多个坐标放入线串元素中。目前它只是放入最后的坐标,仅此而已。它将整个集合打印到屏幕上,所以我认为这不是我的逻辑。

import csv
import simplekml

inputfile = csv.reader(open('foo.csv','r'))
kml=simplekml.Kml()
ls = kml.newlinestring(name="Journey path")

inputfile.next(); # skip CSV header
for row in inputfile:
        ls.coords=[(row[10],row[9])];
        print ls.coords
kml.save('fooline.kml');

【问题讨论】:

    标签: python csv kml simplekml


    【解决方案1】:

    问题

    这一行是你的问题:

    ls.coords=[(row[10],row[9])];
    

    您每次都用一个新列表覆盖 LineString 中的所有坐标,仅包含当前坐标。

    不需要分号,您应该将当前坐标附加到 Linestring 坐标。我在任何地方都找不到任何文档,但似乎coords 不是列表对象,而是simplekml.coordinates.Coordinates,它接受addcoordinates 方法:

    ls.coords.addcoordinates([(row[10],row[9])])
    

    要找到这个未记录的方法,我必须调用:

    print([method for method in dir(ls.coords) if callable(getattr(ls.coords, method))])
    # ['__class__', '__delattr__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'addcoordinates']
    

    这是一个列表示例:

    >>> coords = [(1,1)]
    >>> coords = [(2,2)]
    >>> coords = [(3,3)]
    >>> coords
    [(3, 3)]
    
    >>> coords = []
    >>> coords.append((1,1))
    >>> coords.append((2,2))
    >>> coords.append((3,3))
    >>> coords
    [(1, 1), (2, 2), (3, 3)]
    

    simplekml 对象:

    import simplekml
    
    kml=simplekml.Kml()
    ls = kml.newlinestring(name="Journey path")
    
    ls.coords.addcoordinates([(1,2)])
    ls.coords.addcoordinates([(3,4)])
    ls.coords.addcoordinates([(5,6)])
    print(ls.coords)
    # 1,2,0.0 3,4,0.0 5,6,0.0
    

    解决方案

    import csv
    import simplekml
    
    inputfile = csv.reader(open('foo.csv','r'))
    kml=simplekml.Kml()
    ls = kml.newlinestring(name="Journey path")
    
    inputfile.next()
    for row in inputfile:
            ls.coords.addcoordinates([(row[10],row[9])]) #<-- IMPORTANT! Longitude first, Latitude second.
            print ls.coords
    kml.save('fooline.kml');
    

    【讨论】:

    • 非常感谢您的帮助和解释。我已经尝试过了,但我得到'AttributeError:'Coordinates'对象没有属性'append''。我假设 ls.coords 将其输入视为字符串而不是数组,尽管使用 ls.coords = []?今天早上我已经给了它几个小时,但不能再继续了。
    • @BenH: addcoordinates 是必需的方法。太糟糕了,它没有出现在doc 的任何地方。如果您愿意,可以联系从事此项目的团队。
    • 太棒了!这行得通 - 感谢您的帮助,我想我会联系团队。
    • 请注意,它是.addcoordinates([(longtidue, latitude)])(不是纬度/经度)。 (只是说明以防其他人尝试上述方法但得到像我一样奇怪的结果,直到我将 Lat/Long 切换为 Long/Lat)。
    • @BruceWayne:感谢您的评论。我们通常首先谈论纬度和第二经度的事实经常与我们通常首先写经度(作为 x 坐标)和纬度第二(就像 y)的事实相冲突。这是许多错误的根源。
    猜你喜欢
    • 2020-07-02
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多