从CityGML数据绘制建筑物表面

时间:2017-11-16 20:12:30

标签: python-3.x matplotlib 3d 3d-model

我很久以前一直在努力用3D绘制一些坐标,现在我真的很沮丧,所以你的帮助将会非常受欢迎。

我想从CityGML文件(最初只是一个XML文件)绘制建筑物的外观。使用XML.etree解析CityGML文件并提取坐标没有问题。但在提取坐标后,我无法找到3D绘图的方法。

from xml.etree import ElementTree as ET

tree = ET.parse('3860_5819__.gml')
root = tree.getroot()

namespaces = {
    'ns0': "http://www.opengis.net/citygml/1.0",
    'ns1': "http://www.opengis.net/gml",
    'ns2': "http://www.opengis.net/citygml/building/1.0"
}

c = 0
wallString = []
for wallSurface in root.findall('.//ns2:WallSurface', namespaces):

    for posList in wallSurface.findall('.//ns1:posList', namespaces):
        c += 1
        wallCoordinates = posList.text
        wallCoordinates = wallCoordinates.split()
        wallString.append(wallCoordinates)


verts = []
for string in wallString:
    X, Y, Z = [], [], []

    c = 0
    for value in string:
        value = float(value)

        if c % 3 == 0:
            X.append(value)
        elif c % 3 == 1:
            Y.append(value)
        else:
            Z.append(value)

        c += 1
        if c > len(string) - 3:
            break

    vert = [list(zip(X, Y, Z))]
    verts.append(vert)


from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt

fig = plt.figure()
ax = Axes3D(fig)

for vert in verts:
    ax.add_collection3d(Poly3DCollection(vert))

ax.autoscale_view(tight=True, scalex=True, scaley=True, scalez=True)
plt.show()
plt.close()

问题可能在于我无法使我的情节变得紧张而且#34;?如果没有,是否有一些我从根本上做错的事情?

如果相关,本案例中的CityGML文件与TU柏林创业中心有关,可以从here获取。

1 个答案:

答案 0 :(得分:1)

刚才意识到代码的主要部分没有任何问题。唯一的问题是没有设置轴。我改变了这个情节部分:

import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as mpl3

fig = plt.figure()
ax = mpl3.Axes3D(fig)

for vert in verts:
    poly = mpl3.art3d.Poly3DCollection(vert)
    ax.add_collection3d(poly)
ax.set_xlim3d(left=386284-50,right=386284+50)
ax.set_ylim3d(bottom=5819224-50, top=5819224+50)
ax.set_zlim3d(bottom=32-10,top=32+20)

plt.show()
plt.close()

现在它完美无缺。