2011-09-23 61 views
8

Tôi mới sử dụng Python. Tôi đang làm việc trên các tập tin gps. Tôi cần phải chuyển đổi một tập tin CSV có tất cả các dữ liệu gps để tập tin kml. Dưới đây là mã trong python Tôi đang sử dụng:Tạo kml từ csv bằng 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() 

Các tập tin csv Tôi đang sử dụng hiện có sẵn ở đây: dip12Sep11newEdited.csv tệp KML tạo hiện có sẵn ở đây: csv2kml.kml Nhưng file kml không nhận được tạo ra một cách chính xác. Dường như sau một số hàng trong csv, mã không thể tạo thêm Dấu vị trí. Nó không thể lặp lại. Bạn có thể thấy điều đó bằng cách cuộn đến phần cuối cùng của tệp kml được tạo.

Bất kỳ ai cũng có thể giúp tôi tìm ra lỗi trong mã, vì đối với một số tệp csv nhỏ hơn, tệp hoạt động chính xác và tạo tệp kml đầy đủ.

Cảm ơn.

+0

Làm cách nào để bạn biết rằng không thể tạo thêm Dấu vị trí?(Nó có bao giờ nhắc 'File Created' không?) – KevinDTimm

+0

Có nó nhắc 'File Creted'. Nhưng nếu bạn mở tập tin kml trong notepad bạn có thể thấy rằng tập tin đã không viết hoàn toàn. – Darkpain

Trả lời

7

Bạn không trả lời truy vấn ở trên, nhưng tôi đoán là lỗi là bạn không đóng tệp xuất của mình (mà sẽ xóa đầu ra của bạn).

f.close() 
+0

Nếu bạn kiểm tra tệp kml, bạn có thể thấy rằng nó kết thúc đột ngột. – Darkpain

+2

Ya đó là vấn đề. Chỉ cần thêm f.close() và nó hoạt động như một sự quyến rũ. Cảm ơn rất nhiều. – Darkpain

1

Thie simplekml gói hoạt động rất tốt và làm việc dễ dàng như vậy.

Để cài đặt trên Ubuntu, hãy tải xuống phiên bản mới nhất và chạy phần sau từ thư mục chứa nội dung lưu trữ.

sudo python setup.py install 

Ngoài ra còn có some tutorials để giúp bạn bắt đầu.

0

Mã này cũng được viết cảm ơn bạn vì bài đăng. Tôi đã làm cho nó hoạt động bằng cách đặt CSV của tôi trong cùng thư mục với mã .py.

tôi đã thực hiện một vài chỉnh sửa để mang nó đến 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() 

Hy vọng nó sẽ giúp nếu bạn đang cố gắng để chuyển đổi dữ liệu của bạn.

1

Một câu trả lời đề cập đến "etree", một lợi thế mà bạn không cần phải hardcode định dạng xml:

Dưới đây là một trong những ví dụ của tôi, tất nhiên bạn phải điều chỉnh nó cho trường hợp của bạn, nhưng bạn có thể nhận được các nguyên tắc ý tưởng của tác phẩm như thế nào etree:

để có được một cái gì đó như thế này

<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> 

bạn có thể sử dụng mã này:

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) 

cũng có một số thông tin khác here

+0

Lưu ý rằng tôi đã thực hiện một sửa chữa trong bài đăng của tôi để làm cho nó ngắn gọn hơn. Bất kỳ phần tử nào bạn chỉ đặt văn bản hoặc thuộc tính đơn lẻ và không cần giữ tham chiếu để thêm các phần tử con có thể được thực hiện trong một dòng. Ví dụ: 'ET.SubElement (OGRVRTLayer," GeometryType "). Văn bản =" wkbPoint " – ssokolow