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

Я новичок в 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.

Благодарю.

6 ответов

Решение

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

f.close()

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

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

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

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

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

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

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

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

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

sudo python setup.py install

Есть также несколько уроков, которые помогут вам начать.

Просто используйте библиотеку simplekml, чтобы легко создавать kml... вместо того, чтобы записывать данные kml. Я добился этого напрямую, используя simplekml.

      import simplekml

Прочтите документацию по simplekml

      with open(arguments+'.csv', 'r') as f:
    datam = [(str(line['GPSPosLongitude']), str(line['GPSPosLatitude'])) for line in csv.DictReader(f)]
    kml = simplekml.Kml()
    linestring = kml.newlinestring(name='linename')
    linestring.coords = datam
    linestring.altitudemode = simplekml.AltitudeMode.relativetoground
    linestring.style.linestyle.color = simplekml.Color.lime
    linestring.style.linestyle.width = 2
    linestring.extrude = 1
    kml.save('file.kml')
    kml.savekmz('file.kmz', format=False)
    kml2geojson.main.convert('file.kml', '')
Другие вопросы по тегам