【发布时间】:2014-08-05 03:13:50
【问题描述】:
我有一个描述地理坐标的大型 XML 文档(准确地说是 KML);下面的 sn-p 应该让您了解它的外观。这里的问题是坐标是双精度的(小数点后 16 位),这会在进一步处理中造成很多问题(此外,最后一个小数位实际上是十分之一纳米 - 我们的 GPS 并不那么精确)。
我一直在寻找将精度降低到给定值的任何方法,例如5 位小数给我们一个米的精度。我尝试在 Python 中解析 XML(使用 lxml),更改值并保存新文档,但在处理过程中文档的格式发生了很大变化,并且以某种方式破坏了进一步的处理。
因此,我正在寻找一种就地降低精度的方法,以便更改原始文件中的值。我认为 AWK 应该可以解决问题,但遗憾的是我的尝试无济于事。
这是my XML 的示例。
<Document xmlns="http://www.opengis.net/kml/2.2">
<Folder><name>Export_Output02</name>
<Placemark>
<Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
<ExtendedData><SchemaData schemaUrl="#Export_Output02">
<SimpleData name="species">1312</SimpleData>
<SimpleData name="area">7848012</SimpleData>
<SimpleData name="irrep_area">0.00000012742</SimpleData>
<SimpleData name="groupID">2</SimpleData>
</SchemaData></ExtendedData>
<MultiGeometry>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>-57.843052746056827,-33.032934004012787 -57.825312079170494,-33.089724736921667 -57.888494029914156,-33.073777852969904 -57.843052746056827,-33.032934004012787</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>-57.635769389832561,-33.032934004012787 -57.618028722946228,-33.089724736921667 -57.681210673689904,-33.073777852969904 -57.635769389832561,-33.032934004012787</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</MultiGeometry>
</Placemark>
</Folder>
</Document>
[编辑]
我的 Python 代码:
import glob
import argparse
from pykml import parser
from pykml.helpers import set_max_decimal_places
arg_parser = argparse.ArgumentParser(description='Script for batch reduction of precision of KML files', prog='KML precision reducer')
arg_parser.add_argument('-p', '--precision', type=int, default=5, help='Desired precision')
arg_parser.add_argument('-d', '--directory', default='./', help='Path to KML files')
args = arg_parser.parse_args()
path_to_kml = glob.glob(args.directory + '*.kml')
precision = args.precision
for kml_file in path_to_kml:
print 'Processing ' + kml_file
with open(kml_file) as file_read:
doc = parser.parse(file_read)
max_decimals={'longitude': precision, 'latitude': precision,}
for element in doc.iter("*"):
set_max_decimal_places(element, max_decimals)
out_filename = kml_file.replace('.kml', '_out.kml')
with open(out_filename, 'w') as file_write:
doc.write(file_write, pretty_print=True, with_tail=True)
【问题讨论】:
-
XML 文档的“格式”应该无关紧要,只要唯一的区别是不重要的空格和空标签(单个或成对)。当您使用 lxml 时,下游会发生什么“中断”?
-
@JimGarrison 我也是这么想的。遗憾的是,我不知道到底出了什么问题。转换为最终目标的 Google Fusion Table 没有错误,尽管最终结果缺少几何图形(所以我得到了一张没有任何点的地图)。我应该补充一点,Google Fusion Tables 施加了很多限制,所以很可能是行数太大或类似的情况。
-
您可以使用 XSLT 来转换坐标。
-
如果您需要帮助,您应该发布 Python 代码和您获得的输出示例。
-
@helderdarocha 由于我对 XSLT 完全不熟悉,您能否举出更具体的例子,我可以效仿吗?谢谢!
标签: python xml xslt awk xml-parsing