为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2021-12-21 16:12:02
编辑:我试图在 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行。
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

像这样的例子:


import json

data = 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_features

json_data = json.dumps(data)


查看完整回答
反对 回复 2021-12-21
?
弑天下

TA贡献1818条经验 获得超8个赞

是的,可以在 python 中得到你的结果。它只需要将 json 数据存储到我们可以在 python 中使用的数据结构中,然后编写一个算法来组合具有相同实体类型的特征。我写了一个脚本来做到这一点,以及评论。程序从Point特征中提取文本属性并将其放入特征的属性中LineString。然后,我们基本上丢弃了Point。顺便说一句,您的 'before' json 数据有一个不应该在那里的尾随逗号。使用 Python 3.7.0:


import json

import collections



def 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()


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 352 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号