Создайте kml из csv в Python - PullRequest
       51

Создайте kml из csv в Python

8 голосов
/ 23 сентября 2011

Я новичок в Python. Я работаю над файлами GPS. Мне нужно конвертировать файл CSV, имеющий все данные GPS в файл 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.

Спасибо.

Ответы [ 5 ]

7 голосов
/ 23 сентября 2011

Вы не ответили на запрос выше, но я предполагаю, что ошибка в том, что вы не закрываете свой выходной файл (который очистит ваш вывод).

f.close()
4 голосов
/ 23 сентября 2011

используйте etree для создания вашего файла

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

Он включен в Python и защищает вас от создания поврежденного XML.(Например, потому что fname содержит &, что имеет особое значение в XML.)

1 голос
/ 12 ноября 2014

В одном ответе упоминается "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)

также немного больше информации здесь

1 голос
/ 14 декабря 2012
Пакет

Thie simplekml работает очень хорошо и облегчает работу с такими вещами.

Чтобы установить в Ubuntu, загрузите последнюю версию и выполните следующую команду из каталога, содержащего содержимое архива.

sudo python setup.py install

Есть также несколько учебных пособий , с которых можно начать.

0 голосов
/ 27 марта 2014

Этот код хорошо написан спасибо за пост. Я заставил его работать, поместив мой 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()

Надеюсь, это поможет, если вы пытаетесь конвертировать ваши данные.

...