2014-02-27 350 views
0

我有一些座標存儲爲列表。我遍歷列表,我想在KML文件中寫入座標。所以我應該結束了類似下面:遍歷列表或元組?

<coordinates>-1.59277777778, 53.8271055556</coordinates> 
<coordinates>-1.57945488999, 59.8149016457</coordinates> 
<coordinates>-8.57262235411, 51.1289412359</coordinates> 

我有問題是在列表中的第一項我的代碼,結果被重複三次:

<coordinates>-1.59277777778, 53.8271055556</coordinates> 
<coordinates>-1.59277777778, 53.8271055556</coordinates> 
<coordinates>-1.59277777778, 53.8271055556</coordinates> 

我想我知道它爲什麼會發生,因爲腳本會看到.strip行並在列表中打印第一個項目3次。

這裏是我的代碼:

oneLat = ['53.8041778', '59.8149016457', '51.1289412359'] 
oneLong = ['1.5192528', '1.57945488999', '8.57262235411'] 

with open("file",'w') as f: 
      f.write('''<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
<Document> 
    <name>TracePlace</name> 
    <open>1</open> 
    <Style id="Photo"> 
     <IconStyle> 
      <Icon> 
       <href>../pics/icon.jpg</href> 
      </Icon> 
     </IconStyle> 
     <LineStyle> 
      <width>0.75</width> 
     </LineStyle> 
    </Style> 
<Folder>''')  

coord_pairs = zip(map(float, oneLong), map(float, oneLat)) 
itemsInListOne = int(len(oneLat)) 

iterations = itemsInListOne 

num = 0 

while num < iterations: 
    num = num + 1 
    for coord in coord_pairs: 
     print (str(coord).strip('()')) 
     f.write("\t\t<coordinates>" + "-" + (str(coord).strip('()')) + "</coordinates>\n") 
     break 

f.write(''' 
</Folder> 
     </Document> 
     </kml>''') 
f.close() 

我怎樣才能得到正確的「映射」座標寫入KML文件?通過「正確」的座標,我的意思是像我的第一個例子

感謝

+2

看起來你遺漏了一些源代碼。第一個'f.write()'沒有任何結束引用。 –

+0

剛剛添加了缺少的代碼。我在腳本的這一部分只有一個f.close()。迭代將相同的代碼塊寫入3次,這是我需要做的。一旦完成了3次迭代,我就關閉了文件。問題在於它正在從列表中寫入相同的項目。我需要它寫下列表中的下一個項目。謝謝。 – BubbleMonster

回答

1

問題出在您的break系列。在第一次迭代之後,你跳出了coordPair循環。您的while循環運行len(coordPairs)==3次,所以第一項重複3次。

下面是一些改進(註釋)代碼:

oneLat = ['53.8041778', '59.8149016457', '51.1289412359'] 
oneLong = ['1.5192528', '1.57945488999', '8.57262235411'] 

# Do the negation here, instead of in the string formatting later 
coordPairs = zip((-float(x) for x in oneLong), (float(x) for x in oneLat)) 

with open("file",'w') as f: 
    f.write(xmlHeaderStuff) # I've left out your string literal for brevity  

    #I assume the purpose of the two loops, the while loop and for loop, 
    #is for the purpose of repeating the group of 3 coord pairs each time? 

    for i in range(len(coordPairs)): 
     for coord in coordPairs: 
      f.write("\t\t<coordinates>{}, {}</coordinates>\n".format(*coord)) 
      # break <-- this needs to go 

    f.write(xmlFooterStuff) 

# f.close() <-- this is unnecessary, since the `with` block takes care of 
# file closing automatically 
0

爲什麼你會過的東西這麼多複雜?你介紹了一些奇怪的num迭代計數器,並沒有使用它。我不會調試你的代碼,因爲它感覺太臃腫,但給你一些工作。

你可以簡單地遍歷zip對象是這樣的:

oneLat = ['53.8041778', '59.8149016457', '51.1289412359'] 
oneLong = ['1.5192528', '1.57945488999', '8.57262235411'] 


coord_pairs = zip(oneLong, oneLat) 
for coord in coord_pairs: 
    print("{}, {}".format(coord[0], coord[1])) 

輸出繼電器似乎罰款:

1.5192528, 53.8041778 
1.57945488999, 59.8149016457 
8.57262235411, 51.1289412359 

我想你應該可以把它包起來用回寫文件。

編輯:好的,我想通了什麼是錯的。這一次在coord_pairs上重複3次,但循環裏面有break,所以它停在coord_pairs的第一個元素處。這就是爲什麼第一對重複3次。對不起,坦率地說,代碼看起來像編碼受到影響。

0

不知道爲什麼你要轉換的輸入字符串彩車,只是讓你可以再次把它們變成字符串。這裏有一個襯墊,以獲得這些字符串列表:

['<coordinates>-{}, {}</coordinates>'.format(*pair) for pair in zip(oneLong, oneLat)] 

其分解...

拉鍊()返回(長,LAT)對元組。

[]理解消耗zip,爲左手部分創建一個元素。

左手部分使用format()函數來填充模板和字符串。

*對擴展了從zip()返回的元組,因此該元組的每個成員都被視爲單獨的參數。如果你不關心理解這種風格,你能更明確:

['<coordinates>-{}, {}</coordinates>'.format(long, lat) for long, lat in zip(oneLong, oneLat)] 

如果你有很多的這些,你會更好的用括號,替換[列表解析]這隻會使它成爲一個迭代器,所以你不必創建一箇中間列表。然後,您可以執行如下操作:

lines = ('<coordinates>-{}, {}</coordinates>\n'.format(*pair) for pair in zip(longIter, latIter)) 
with open('yourFile', 'w') as file: 
    for line in lines: 
     file.write(line) 

longIter和latIter可以是列表或其他形式的迭代。