我正面临着一个无法解决的问题。我有一个 GML 文件,它有点类似于 xml 文件。这是一种保存地理数据的本地丹麦文件格式。我一直在玩弄我的代码,现在我可以使用标签和正则表达式提取相关数据,但我不知道如何在数组中设置它以打印为 CSV。问题是 GML-fil 的不对称结构。
<ns3:EjerlejlighedslodGeometri>
<ns3:ejerlejlighedlodId>100028069</ns3:ejerlejlighedlodId>
<ns3:lodlitra>a</ns3:lodlitra>
<ns3:lodBeliggenhedTekst>beboelse</ns3:lodBeliggenhedTekst>
<ns3:lodAreal>290.0</ns3:lodAreal>
<ns3:etage>0</ns3:etage>
<ns3:geometri ns2:type="simple">
<ns1:Polygon srsName="EPSG:25832" ns1:id="bfe.100294022.geom.1.1">
<ns1:exterior>
<ns1:LinearRing>
<ns1:posList srsDimension="2">728019.56 6174957.29 728024.94 6174947.69 728047.95 6174960.6 728042.57 6174970.2 728019.56 6174957.29</ns1:posList>
</ns1:LinearRing>
</ns1:exterior>
</ns1:Polygon>
</ns3:geometri>
</ns3:EjerlejlighedslodGeometri>
我需要的信息是“ns3:ejerlejlighedlodId”,它应该是我的 csv 的第一列,“ns3:etage”应该是第二列,“ns1:posList”下的每个坐标元组应该是第三和第四列。所以上面的 gml 文件示例在 csv 中看起来像这样:
100028069,0,728019.56,6174957.29
100028069,0,728024.94,6174947.69
100028069,0,728047.95,6174960.60
100028069,0,728042.57,6174970.20
100028069,0,728019.56,6174957.29
问题之一是每个“ns3:etage”标签下可以有多个“ns1:posList”标签,包含可变数量的坐标元组。
我知道我在这里问了很多人,但是我已经解决这个问题好几天了,没有任何进展。我可以将提取的信息片段很好地提取到单独的 python 字典中,但后来我迷路了。到目前为止我的代码:
#from GMLParser import GMLParser
#import numpy
#import pandas
#import xml.etree.ElementTree as et
import re
print("Hello World!")
appUnits = []
unitDicts = []
with open("GeoPanter ejl-geometri.gml") as gmlFile:
linesInFile = gmlFile.readlines()
for line in linesInFile:
unit = {}
#if "etage" in line or "posList" in line or "ejerlejlighedlodId" in line:
if "ejerlejlighedlodId" in line:
id = re.search(">(.*?)\<", line)
idMatch = id.group()
#print(idMatch[1:-1])
unit["id"] = idMatch[1:-1]
elif "etage" in line:
etage = re.search(">(.*?)\<", line)
etageMatch = etage.group()
#print(etageMatch[1:-1])
unit["etage"] = etageMatch[1:-1]
elif "posList" in line:
geom = re.search(">(.*?)\<", line)
geomMatch = geom.group()
#print(geomMatch[1:-1])
unit["geom"] = geomMatch[1:-1]
unitDicts.append(unit)
for unit in unitDicts:
if unit != {}:
appUnits.append(unit)
#print(appUnits)
for app in appUnits:
print(app)
我听说使用常规 espressions 并不是做这类工作的最佳方式,所以我正在使用 beatifulsoup 编写一些替代代码。从标签之间获取信息似乎具有挑战性,但我可以做到。如何将数据重建为 csv 让我很头疼。
最好的问候和快乐的星期四,
雅各布