Как уменьшить десятичные координаты в локальном файле kml с помощью pykml?

У меня есть файл kml, в котором есть ячейка с более чем 1 миллионом символов. Я хочу уменьшить количество десятичных знаков с 12 до 3. Я импортировал lxml и 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»


person user3324502    schedule 18.02.2014    source источник


Ответы (1)


Это потому, что вы загружаете 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,})

Обновление:

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

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))
person Matthew    schedule 18.02.2014
comment
Итак, я ожидаю, что в первой ситуации вам просто нужно записать файл обратно на диск? Во-вторых, я ожидаю, что у вас установлен недопустимый атрибут KML - попробуйте проверить свой документ. Если это так, просто используйте первый метод, так как вам нужно иметь действительный KML для внесения этих обновлений или его использования. - person Matthew; 18.02.2014
comment
Мой комментарий перед вашим последним был адресован этому комментарию до того, как вы его удалили/повторно добавили. - person Matthew; 18.02.2014
comment
Я предлагаю вам начать с примера в связанной документации, просто используя строку, которую вы установили в скрипте. Как только это заработает, попробуйте загрузить отрывок из вашего файла (несколько записей в новом тестовом файле из вашего огромного документа) и убедитесь, что он работает должным образом. Затем переходите к обработке всего этого. - person Matthew; 18.02.2014
comment
Спасибо, Мэтью, я пытаюсь реализовать вашу точку зрения. Я использую nsmap, но все еще безуспешно. - person user3324502; 18.02.2014
comment
Наконец это сработало. из lxml импортировать etree из pykml.helpers импортировать set_max_decimal_places из парсера импорта pykml с помощью open('C:\Users\Mehrnoosh Oghbaie\Desktop\Python\United States Divisions. Уровень 2.kml') как 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)) - person user3324502; 18.02.2014