2017-04-05 224 views
1

我有一堆CSV文件,其中包含經緯度和長度等字段。每一行都是旅程中的一個點。我正在嘗試創建一個KML,將行程顯示爲線串,但無法完全弄清楚如何將多個座標轉換爲線串元素。目前它只是放入最後的座標,這就是全部。它打印整個屏幕,所以我不認爲這是我的邏輯。使用Python和simplekml從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'); 

回答

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'); 
+0

非常感謝幫助和解釋。我試過,但我得到'AttributeError:'座標'對象沒有屬性'追加''。我假設ls.coords將其輸入視爲一個字符串而不是數組,儘管用ls.coords = []聲明瞭它。今天早上我已經給了它幾個小時,但不能再進一步了。 –

+0

@BenH:'addcoordinates'是必需的方法。太糟糕了,它不會出現在[doc](http://simplekml.readthedocs.io/en/latest/reference.html)的任何地方。如果你喜歡它,你可以聯繫在這個項目上工作的團隊。 –

+0

太棒了!這很有用 - 感謝您的幫助,我想我會聯繫團隊。 –