0

我正面临着一个无法解决的问题。我有一个 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 让我很头疼。

最好的问候和快乐的星期四,

雅各布

4

0 回答 0