Combine part of geojson object into another in Python

后端 未结 2 587
慢半拍i
慢半拍i 2021-01-16 15:47

EDIT: I am trying to manipulate JSON files in Python. In my data some polygons have multiple related information: coordinates (LineString) and

相关标签:
2条回答
  • 2021-01-16 16:13

    example like this:

    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)
    
    0 讨论(0)
  • 2021-01-16 16:25

    Yes, it is possible to get your result in python. It just requires storing the json data into a data structure we can work with in python and then writing an algorithm to combine features with the same entity type. I wrote up a script to do just that, along with comments. The program extracts the text property from the Point feature and places it into the properties of the LineString feature. Then, we essentially discard Point. BTW, your 'before' json data has a trailing comma that shouldn't be there. Using 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()
    
    0 讨论(0)
提交回复
热议问题