在Python中将geojson对象的一部分合并到另一个对象中 [英] Combine part of geojson object into another in Python

查看:168
本文介绍了在Python中将geojson对象的一部分合并到另一个对象中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑:我正在尝试在Python中操作JSON文件.在我的数据中,某些多边形具有多个相关信息:坐标(LineString)和面积百分比区域(Point中的TextArea),我想要将它们组合为单个JSON对象.例如,来自文件的数据如下:

I am trying to manipulate JSON files in Python. In my data some polygons have multiple related information: coordinates (LineString) and area percent and area (Text and Area in Point), I want to combine them to a single JSON object. As an example, the data from files are as follows:

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]
                }
            },
            {
                "type": "Feature",
                "properties": {
                    "Layer": "0",
                    "SubClasses": "AcDbEntity:AcDbMText",
                    "EntityHandle": "2F1",
                    "Area": "100"
                },
                "geometry": {
                    "type": "Point",
                    "coordinates": [50.216857362443989, 63.981197759829229, 0.0]
                }
            },
            {
                "type": "Feature",
                "properties": {
                    "Layer": "0",
                    "SubClasses": "AcDbEntity:AcDbBlockReference",
                    "EntityHandle": "2F7"
                },
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [62.37106968111857, 36.504489398648715],
                        [62.371069689452725, 19.404489281863786],
                        [63.171069496474047, 19.404489281863786],
                        [63.171069496474047, 17.404489281863786],
                        [77.921070051947027, 17.404489281863786],
                        [77.921070051947027, 19.504489281855054],
                        [78.671070051947027, 19.504489281855054],
                        [78.671070051897914, 36.504485105717322],
                        [62.37106968111857, 36.504489398648715]
                    ]
                }
            },
            {
                "type": "Feature",
                "properties": {
                    "Layer": "0",
                    "SubClasses": "AcDbEntity:AcDbMText",
                    "EntityHandle": "2F7",
                    "Text": "5.8%"
                },
                "geometry": {
                    "type": "Point",
                    "coordinates": [67.27548061311245, 28.11445704760262, 0.0]
                }
            }
        ]
    }

我想根据EntityHandle的值将PointTextArea键和值组合到LineString,并删除Point行.预期的输出是:

I want to combine Point's Text and Area key and values to LineString based on EntityHandle's values, and also delete Point lines. The expected output is:

    {
        "type": "FeatureCollection",
        "name": "entities",
        "features": [{
                "type": "Feature",
                "properties": {
                    "Layer": "0",
                    "SubClasses": "AcDbEntity:AcDbBlockReference",
                    "EntityHandle": "2F1",
                    "Text": "6%",
                    "Area": "100"
                },
                "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:AcDbBlockReference",
                    "EntityHandle": "2F7",
                    "Text": "5.8%"
                },
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [62.37106968111857, 36.504489398648715],
                        [62.371069689452725, 19.404489281863786],
                        [63.171069496474047, 19.404489281863786],
                        [63.171069496474047, 17.404489281863786],
                        [77.921070051947027, 17.404489281863786],
                        [77.921070051947027, 19.504489281855054],
                        [78.671070051947027, 19.504489281855054],
                        [78.671070051897914, 36.504485105717322],
                        [62.37106968111857, 36.504489398648715]
                    ]
                }
            }
        ]
    }

是否可以在Python中获得以上结果?谢谢.

Is it possible to get result above in Python? Thanks.

更新了解决方案,这要归功于@dodopy:

Updated solution, thanks to @dodopy:

import json
features = data["features"]
point_handle_text = {
    i["properties"]["EntityHandle"]: i["properties"]["Text"]
    for i in features
    if i["geometry"]["type"] == "Point"
}
point_handle_area = {
    i["properties"]["EntityHandle"]: i["properties"]["Area"]
    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

combine_features = []
for i in features:
    if i["geometry"]["type"] == "LineString":
        i["properties"]["Area"] = point_handle_area.get(i["properties"]["EntityHandle"])
        combine_features.append(i)
data["features"] = combine_features

with open('test.geojson', 'w+') as f:
    json.dump(data, f, indent=2)

但是我得到一个错误:

Traceback (most recent call last):
  File "<ipython-input-131-d132c8854a9c>", line 6, in <module>
    for i in features
  File "<ipython-input-131-d132c8854a9c>", line 7, in <dictcomp>
    if i["geometry"]["type"] == "Point"
KeyError: 'Text'

推荐答案

像这样的示例:

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)

这篇关于在Python中将geojson对象的一部分合并到另一个对象中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆