猿问

在 Python 中将 geojson 对象的一部分合并到另一个对象中

编辑:我试图在 Python 中操作 JSON 文件。在我的数据中,一些多边形有多个相关信息:坐标 ( LineString) 和面积百分比和面积(Text和Areain Point),我想将它们组合成一个 JSON 对象。例如,来自文件的数据如下:


data = {

        "type": "FeatureCollection",

        "name": "entities",

        "features": [{

                "type": "Feature",

                "properties": {

                    "Layer": "0",

                    "SubClasses": "AcDbEntity:AcDbBlockReference",

                    "EntityHandle": "2F1"

                },

                "geometry": {

                    "type": "LineString",

                    "coordinates": [

                        [61.971069681118479, 36.504485105673659],

                        [46.471068755199667, 36.504485105673659],

                        [46.471068755199667, 35.954489281866685],

                        [44.371068755199758, 35.954489281866685],

                        [44.371068755199758, 36.10448936390457],

                        [43.371069617387093, 36.104489150107824],

                        [43.371069617387093, 23.904496401184584],

                        [48.172716774891342, 23.904496401184584],

                        [48.171892994728751, 17.404489374370311],

                        [61.17106949647404, 17.404489281863786],

                        [61.17106949647404, 19.404489281863786],

                        [61.971069689453991, 19.404489282256687],

                        [61.971069681118479, 36.504485105673659]

                    ]

                }

            },

            {

                "type": "Feature",

                "properties": {

                    "Layer": "0",

                    "SubClasses": "AcDbEntity:AcDbMText",

                    "EntityHandle": "2F1",

                    "Text": "6%"

                },

                "geometry": {

                    "type": "Point",

                    "coordinates": [49.745686139884583, 28.11445704760262, 0.0]

                }

            },


我想将Point'sText和Areakey 和值组合到LineString基于EntityHandle's 的值,并删除 Point行。


哆啦的时光机
浏览 353回答 2
2回答

婷婷同学_

像这样的例子:import jsondata = json.loads(json_data)features = data["features"]point_handle_text = {    i["properties"]["EntityHandle"]: i["properties"]["Text"]    for i in features    if i["geometry"]["type"] == "Point"}combine_features = []for i in features:    if i["geometry"]["type"] == "LineString":        i["properties"]["Text"] = point_handle_text.get(i["properties"]["EntityHandle"])        combine_features.append(i)data["features"] = combine_featuresjson_data = json.dumps(data)

弑天下

是的,可以在 python 中得到你的结果。它只需要将 json 数据存储到我们可以在 python 中使用的数据结构中,然后编写一个算法来组合具有相同实体类型的特征。我写了一个脚本来做到这一点,以及评论。程序从Point特征中提取文本属性并将其放入特征的属性中LineString。然后,我们基本上丢弃了Point。顺便说一句,您的 'before' json 数据有一个不应该在那里的尾随逗号。使用 Python 3.7.0:import jsonimport collectionsdef main():    with open('before_data.json') as f:        before_data = json.load(f)  # makes a python dict from the json file and stores in before        features = before_data['features']  # list of features        # loop through features, construct dictionary of entity handle mapped to point texts        point_entities = collections.defaultdict()  # to avoid 'if key not in' pattern        for feature in features:            entity_handle = feature['properties']['EntityHandle']            # only append points            if feature['geometry']['type'] == 'Point':                point_entities[entity_handle] = feature['properties']['Text']        merged_features = []        for feature in features:            if feature['geometry']['type'] == 'LineString':                entity_handle = feature['properties']['EntityHandle']                text_percent = point_entities[entity_handle]                feature['properties']['Text'] = text_percent                merged_features.append(feature)        # print(json.dumps(before_data, indent=4))        result = before_data        result['features'] = merged_features    # compare with your expected output    with open('after_data.json') as f:        after_data = json.load(f)        print(result == after_data)  # returns True    # finally, write your result to a file    with open('result.json', 'w') as output_file:        json.dump(result, output_file)if __name__ == '__main__':    main()
随时随地看视频慕课网APP

相关分类

Python
我要回答