Элемент коллекции переопределяется при добавлении элементов в цикл for

#python #json #geojson

#python #json #geojson

Вопрос:

У меня есть geojson объект, в котором могут быть объекты типа multi-polygon или polygon. Если он многополигонный, я хочу разбить его на полигоны.

 {
     "type": "FeatureCollection",
     "features": [
         {
             "type": "Feature",
             "properties": {
                 "id": "86aba1ae-80e2-49d4-ab32-c2744a3b4bf4"
             },
             "geometry": {
                 "type": "MultiPolygon",
                 "coordinates": [
                     [...],
                     [...]
                 ]
             }
         }
      ]
}
 

Например, выше geojson следует создать 2 функции, которые работают нормально, но я также хочу создать уникальные id для каждого из них, с которыми я работаю str(uuid.uuid4()) . Это дает уникальный идентификатор для каждого xfeature , но когда он добавляется в output коллекцию, второй всегда переопределяет первый, и идентификаторы дублируются. Я не могу найти причину, по которой это происходит, и как ее решить.

 js = open('test.geojson', 'r').read()
gj = json.loads(js)

output = {"type": "FeatureCollection", "features": []}

for feature in gj['features']:
    if ((feature['geometry'] is not None) 
        and (feature['geometry']['type'] == 'MultiPolygon')):
        for poly in feature['geometry']['coordinates']:
            xfeature = {"type": "Feature", 'properties': feature['properties'], 
                        "geometry": {"type": "Polygon"}}
            xfeature['properties']['id'] = str(uuid.uuid4())
            xfeature['geometry']['coordinates'] = poly
            output['features'].append(xfeature)
    else:
        output['features'].append(feature)
 

Ответ №1:

Проблема 'properties': feature['properties'] в строке

     xfeature = {"type": "Feature", 'properties': feature['properties'], "geometry": {"type": "Polygon"}}
 

вы должны его клонировать.

Для этого используйте deepcopy — https://docs.python.org/3/library/copy.html