Предотвратить Python For Loop от перезаписи словаря - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать новый словарь (intersections), который содержит пересекающиеся области из многоугольников в словаре с именем zones.

Я использую combinations, чтобы найти все возможные уникальные комбинации zones. Затем я использую .intersects() Shapely для проверки if пересечения зон. Если они это сделают, я бы хотел, чтобы их геометрия сохранялась в переменной int_geometry, а затем сохранялась в словаре (используя: Shapely's .intersection()).

Я знаю, что есть четыре пересечения, потому что этот код возвращает их:

for a, b in combinations(zones.values(), 2):
  a_geom = a['location']
  b_geom = b['location']
  if a_geom.intersects(b_geom) == True:
    print a_geom.intersection(b_geom)

Однако, если я заменю то, что следует после оператора if, как показано в коде ниже, он начнет перезаписываться сам.

intersections = {}    

for a, b in combinations(zones.values(), 2):
  a_geom = a['location']  
  b_geom = b['location']  
  if a_geom.intersects(b_geom) == True:
    int_geometry = a_geom.intersection(b_geom)
    int_area = round(int_geometry.area,2)
    int_perimeter = round(int_geometry.length,2)
    intersections = {
      'geometry' : int_geometry,
      'attributes' : {
        'area' : int_area,
        'perimeter' : int_perimeter,
      }
    }    

pprint(intersections)

Есть несколько тем по схожим вопросам, хотя я не могу найти свой ответ. Я знаю, что упускаю из виду что-то очень очевидное, но не могу это обнаружить. Может кто-нибудь объяснить мне, что я делаю не так?

1 Ответ

0 голосов
/ 08 сентября 2018

index в int_index = "int_index " + str(index + 1) всегда будет таким же значением, как и после первого цикла, его значение является постоянным.Следовательно, данные перезаписываются.

...

# PART 2 - ANALYSE THE DATA
intersections = {}
index = 0

for a, b in combinations(zones.values(), 2):
  a_geom = a['location']
  b_geom = b['location']
  if a_geom.intersects(b_geom) == True:
    int_index = "int_index " + str(index + 1)
    int_geometry = a_geom.intersection(b_geom)
    int_area = round((a_geom.intersection(b_geom).area),2)
    int_perimeter = round((a_geom.intersection(b_geom).length),2)
    intersections[int_index] = {
      'geometry' : int_geometry,
      'attributes' : {
        'area' : int_area,
        'perimeter' : int_perimeter,
      }
    }
    index += 1

pprint(intersections)
...