1

I've got something working for QGIS 2.8 using Python 2.7 on Windows 7, but I am missing an important part of the puzzle. I'm trying to develop an algorithm to number homes. I've now come to a point where some neighbors have a duplicate house number. For this reason, I've come with a python script that successfully increments the numbers by two (to keep numbers odd or even), depending on the number of duplicates (n-1 for n duplicates, so that exactly one gets to keep the original number). I'm dealing with a metric numbering system, where the house number corresponds with a distance of the home along the road it belongs to.

Starting with this dictionary, where the keys are feature IDs and the values are the concatenated homeNumber_roadNumber:

Deca_dict = {
    "1": "2_506",
    "2": "2_506",
    "3": "2_506",
    "4": "2_600",
    "5": "1_650",
    "6": "2_600"
}

I counted the number of occurrences and kept track of the original number i'm interested in incrementing:

decaAdd_occurrences = {k: (int(k.split('_')[0]), v) for k,v in
                                Counter(Deca_dict.values()).items()}

With the help of a Stack Overflow answer, I adapted my needs and got here:

I adapted the answer's code like so:

changed_deca_dict = {}
alpha_deca_dict = {}
for key, value in Deca_dict.items():
    num, cnt = decaAdd_occurrences[value]
    if cnt > 1:
        route = value.split('_')[1]
        next_num = num + 1
        next_add = str(next_num) + '_' + str(route)
        if not next_add in Deca_dict.values():
            Deca_dict[key] = '{}_{}'.format(next_num, route)
            decaAdd_occurrences[value] = next_num, cnt-1
            changed_deca_dict[key] = '{}_{}_{}'.format(num, next_num, route)
        else:
            alpha_deca_dict[key] = value

This gives me the resulting dictionaries:

Deca_dict -> {
    "1": "3_506",
    "2": "2_506",
    "3": "4_506",
    "4": "3_600",
    "5": "1_650",
    "6": "2_600"
}

changed_deca_dict = {'1':'2_3_506', '3':'2_4_506','4':'2_3_600'}

I have another dictionary with the same keys and their distances along an axis (the order in which I'm trying to number these values)

distance_dict = {'3': 1.0,'1': 2.2,'2': 3.1,'4': 2.0,'5': 1.5,'6': 3.0}

This is the result I would like, re-numbering the duplicate values taking into account the distances of each feature on it's line. Since features 1, 2, and 3 are on the same road, I would re-number the duplicates taking into account their distances along the road. Same for features 4 and 6.

Deca_dict -> {
    "1": "3_506",
    "2": "4_506",
    "3": "2_506",
    "4": "2_600",
    "5": "1_650",
    "6": "3_600"
}

I saw this other thread, which shows how to sort features by a particular field. I'm not sure how to work it in. I'm trying to start by grouping the keys by similar values. I don't want the whole value compared, so this is what I have so far:

for deca_key, deca_value in changed_deca_dict:
    old_num = value.split('_')[0]
    new_num = value.split('_')[1]
    route = value.split('_')[2]
    old_add = str(old_num) + str(route)
    for dist_key, dist_value in distance_dict:
        if dist_key == deca_key:
            check the distance and compare with other Deca_dict.items(), including the one that didn't change
            re-order new_num according to distance along route
user25976
  • 2,115
  • 1
  • 22
  • 39

0 Answers0