从Python的子列表中获取点的x值

问题描述 投票:0回答:1

我有一个 JSON 文件,该文件是一个像 A 一样的嵌套列表。(抱歉 - 它是一本字典)

在坐标中,第一项 (1.1) 保存点的 x 坐标,第二项 (2.2) 保存 y 坐标,第三项 (3.3) 保存点的 z 坐标。第一个点之后的另外三个点是建筑物足迹列表的点。因此,列表中的 4 个点给出了创建线条时的建筑物占地面积曲线。

在第二个数据中,您可以看到 - ** 符号 - 之间,有 2 个子列表。这意味着建筑物足迹数据有 2 个多边形。

A = 

{
"type": "FeatureCollection",
"name": "PROJECT CRS TM 30",
"features": [

{ "type": "Feature", "properties": { "OBJECTID": 0, "ROOF_NUMBER": null, "STOREY": null }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 1.1, 2.2, 3.3 ], [ 4.4, 5.5,6.6 ], [ 7.7, 8.8, 9.9 ], [ 10.10, 11.11, 12.12 ] ] ] ] } },

{ "type": "Feature", "properties": { "OBJECTID": 2215889.0, "ROOF_NUMBER": null, "STOREY": 4 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 13.13, 14.14, 15.15], [ 16.16, 17.17, 18.18 ], [ 19.19, 20.20, 21.21 ], **[ [ [ 22.22, 23.23, 24.24 ], [ 25.25, 26.26, 27.27 ], [ 28.28, 29.29, 30.30 ], [ 31.31, 32.32, 33.33 ] ] ] ] } }**,

]
}

我想获得一个包含点的 x 值的列表,并且我想在不更改建筑物子列表的情况下获得它们。如B:

B = [[[[1.1], [4.4], [7.7], [10.10]]],[[[13.13], [16.16], [19.19]],[[22.22], [25.25], [28.28], [31.31]]]]    

其中每个列表代表点的 x 值。每个功能都有自己的子列表。

当我在 BIM 可视化编程软件中编写这段代码时,我得到了一个像 C 一样的列表。

get_data_values["features"]["geometry"]["coordinates"][0];

C= [ [ [ [ 13.13, 14.14, 15.15], [ 16.16, 17.17, 18.18 ], [ 19.19, 20.20, 21.21 ], [ [ [ 22.22, 23.23, 24.24 ], [ 25.25, 26.26 , 27.27 ], [ 28.28, 29.29, 30.30], [ 31.31, 32.32, 33.33] ] ] ] } }

获得 C 后,我使用下面的代码来获得 B 列表。


    def Extract(lst):
        second_items = []
        for sublst in lst:
            for secsublst in sublst:     
                for thirdsublst in secsublst:
                    second_item = []
                    for item in thirdsublst:
                        second_items.append(second_item)
                        if item:
                            second_item.append(item[1])
                                      
        return second_items

所以,当我尝试这个时,我得到了每个特征的 x 值,但我意识到数据中有 9835 个特征,但最终我只得到 84296 个特征

JSON文件有9835个特征,这意味着有9835个建筑物信息位于。在某些要素中,有 2 个不同的足迹多边形。 [actual total feature number 9835]

当我使用extract def时,我得到的数字是84296。这意味着我得到的建筑物数量更少。

(https://i.stack.imgur.com/c2FuX.png)

如何获得像B这样的9835功能?我已经搜索了论坛,但无法解决我的问题,因为我是初学者。

感谢您的时间和指导。

整个过程是这样的。

python json list revit-api sublist
1个回答
0
投票

您可以使用递归函数来遍历和复制嵌套列表结构,并仅使用第一个值填充新结构。

def flatten_coords(el):
    if el == []:
        return el
    if isinstance(el[0], list):
        return [flatten_coords(el[0])] + flatten_coords(el[1:])
    return el[:1]


x_coords = []

for feature in A["features"]:
    x_coords.append(flatten_coords(feature["geometry"]["coordinates"]))

print(x_coords)

输出:

[[[[[1.1], [4.4], [7.7], [10.1]]]], [[[[13.13], [16.16], [19.19], [[[22.22], [25.25], [28.28], [31.31]]]]]]]
© www.soinside.com 2019 - 2024. All rights reserved.