2014-02-18 1 views
1

У меня есть kml-файл с ячейкой с более чем 1 миллионом символов. Я хочу уменьшить число десятичных чисел с 12 до 3. Я импортировал lxml и pykml.Как уменьшить координаты в десятичном формате в локальном файле kml с помощью pykml?

import pykml 
from pykml.helpers import set_max_decimal_places 
file1=open('\United States divisions. Level 2.kml') 
from os import path 
#set_max_decimal_places(file1, max_decimals={'longitude':3,'latitude':3,}) 

и я получил эту ошибку:

 39   index_no = 0 # longitude is in the first position 
    40   # modify <longitude> 
---> 41   for el in doc.findall(".//{http://www.opengis.net/kml/2.2}longitude"): 
    42    new_val = round(float(el.text), max_decimals[data_type]) 
    43    el.getparent().longitude = K.longitude(new_val) 

AttributeError: «Файл» объект не имеет атрибута «FindAll»

ответ

0

Это потому, что вы загружаете KML просто как файл, и он необходимо сначала проанализировать. От: http://pythonhosted.org/pykml/tutorial.html

In [29]: from pykml import parser 

... 

In [40]: kml_file = path.join(\ 
    ....:  '../src/pykml/test', \ 
    ....:  'testfiles/google_kml_developers_guide', \ 
    ....:  'complete_tour_example.kml') 

In [44]: with open(kml_file) as f: 
    ....:  doc = parser.parse(f) 

Тогда вы можете позвонить:

....:  set_max_decimal_places(doc, max_decimals={'longitude':3,'latitude':3,}) 

Update:

Используя код выше, я думаю, что это должно работать тоже: (from here)

file1=open('\United States divisions. Level 2.kml') 
doc = fromstring(file1.read(), schema=Schema("ogckml22.xsd")) 
set_max_decimal_places(doc, max_decimals=3) 

Обновление: 2

Просто потянув в конечный код, который вы использовали из Вашего комментария:

from lxml import etree 
from pykml.helpers import set_max_decimal_places 
from pykml import parser 

with open('\United States divisions. Level 2.kml') as f: 
    doc=parser.parse(f) 
    set_max_decimal_places(doc, max_decimals={'longitude':3,'latitude':3,}) 

print etree.tostring(doc, pretty_print=True) 
outfile = file(file.rstrip('.py')+'.kml','w') 
outfile.write(etree.tostring(doc, pretty_print=True)) 
+0

Итак - В первой ситуации я ожидаю вам просто нужно записать файл на диск? Во втором я ожидаю, что у вас есть набор атрибутов, который недействителен KML - попробуйте подтвердить свой документ. Если это так, просто используйте первый метод, так как вам не нужно * иметь * иметь действительный KML, чтобы делать эти обновления или использовать его. – Matthew

+0

Мой комментарий перед тем, как вы последний раз обращался к этому комментарию перед удалением/повторным добавлением. – Matthew

+0

Я предлагаю вам начать с примера в связанной документации, просто используя строку, установленную в скрипте. После этого попытайтесь загрузить выдержку из вашего файла (несколько записей в новом тестовом файле из вашего огромного документа) и убедитесь, что он работает должным образом. Затем переходите к обработке всего. – Matthew

Смежные вопросы