2016-06-04 1 views
-1

Ok поэтому у меня есть следующий список dictionarys, что я пытаюсь преобразовать в JSON файл:JSON конвертер только занимает последнее значение ключа для последнего словаря вместо всех

geojson_list = [ 

{'name': 'Parallelogram1', 'coordinates': 
[[115.67097179583487, -32.36672530921233], [115.96656222999665, 
-32.36672530921233], [115.90410905434761, -32.49580085924758], [115.60851862018583, -32.49580085924758], [115.67097179583487, 
-32.36672530921233]], 'area': 0.0381534978746}, 

{'name': 'Parallelogram2', 'coordinates': [[116.00622565359758, 
-32.5791364092627], [116.02283522420637, -32.5791364092627], [116.02126260408991, -32.59706839673082], [116.00465303348112, 
-32.59706839673082], [116.00622565359758, -32.5791364092627]],'area': 0.000297842612008} 

] 

Это конвертер под кодовым названием GeojsonConverter .py:

import json 


def convert_to_geojson(my_list): 
    """ 
    This function converts a list of dictionaries into GeoJSON format 
    The dictionaries require a "coordinates" key whose value will be a 2D 
    list, a "name" key, with all other additional data. 
    :param my_list: A list of dictionaries 
    :return: a GeoJSON string 
    """ 

    try: 
     for d in my_list: 
      coord_list = d["coordinates"] 
      name = d["name"] 
      for coord in coord_list: 
       float(coord[0]) 
       float(coord[1]) 

    except ValueError: 
     print "ValueError: Coordinate cannot be converted to float." 
     return "ValueError: Coordinate cannot be converted to float." 

    except KeyError: 
     print "KeyError: No 'coordinates' or 'name' key found in dictionary" 
     return "KeyError: No 'coordinates' or 'name' key found in dictionary" 

    except Exception as e: 
     raise e 

    else: 
     feature_list = [] 
     property_dict = {} 

     for d in my_list: 
      coord_list = d["coordinates"] 
      coord_list.append(d["coordinates"][0]) 
      name = d["name"] 

      for key in d: 
       if (key is not "name") and (key is not "coordinates"): 
        property_dict[key] = d[key] 

      the_geom = {"type": "MultiPolygon", "coordinates": [[coord_list]]} 
      feature = {"type": "Feature", "geometry": the_geom, "name": name, "properties": property_dict} 
      feature_list.append(feature) 

     feature_collection = {"type": "FeatureCollection", "features": feature_list} 

     return json.dumps(feature_collection) 

Конвертер преобразует список только штрафом вплоть до ключа области. Я продолжаю получать последнее значение в области последнего словаря для всех областей словаря, поэтому в этом случае все области = 0.000297842612008

Это json-файл, который я получаю после запуска списка через конвертер и записи его в файл:

{ "type": "FeatureCollection", "features": [{"geometry": {"type": 
"MultiPolygon", "coordinates": [[[[115.67097179583487, 
-32.36672530921233], [115.96656222999665, -32.36672530921233], [115.90410905434761, -32.49580085924758], [115.60851862018583, 
-32.49580085924758], [115.67097179583487, -32.36672530921233]]]]}, "type": "Feature", "name": "Parallelogram1", "properties": {"area": 
0.000629970457642}}, 

{"geometry": {"type": "MultiPolygon", "coordinates": [[[[116.00622565359758, -32.5791364092627], 
[116.02283522420637, -32.5791364092627], [116.02126260408991, 
-32.59706839673082], [116.00465303348112, -32.59706839673082], [116.00622565359758, -32.5791364092627]]]]}, "type": "Feature", 
"name": "Parallelogram2", "properties": {"area": 0.000629970457642} } 

Обратите внимание, что две разные области равны одному и тому же результату, если они не должны.

Следующий код, как я пишу в файл.

import GeojsonConverter 
my_geojson_string = GeojsonConverter2.convert_to_geojson(geojson_list) 
name = "test" 
try: 
    name = name[:-4] #subtract .csv from name to add a character onto the end of the file name. Eg. zzza.csv, not zzz.csva 
    with open("./datafiles/" + name + "JSON" + ".geojson", 'w') as jsondata: #Save json data into nameJSON.geojson 
     try: 
      print "" 
      print ("Writing json file: " + name + "JSON" + ".geojson") 
      jsondata.write(my_geojson_string) 
     except: 
      print "Error writing to file. FN: write to file" 
      sys.exit() 
except: 
    print "Error opening file. FN: geojson output" 

Куда я иду не так?

редактировать:

изменил последний бит кода преобразователя к этому

for d in my_list: 
     coord_list = d["coordinates"] 
     coord_list.append(d["coordinates"][0]) 
     name = d["name"] 
     area_list = d["area"] 

     for key in d: 
      if (key is not "name") and (key is not "coordinates") and (key is not "area"): 
       property_dict[key] = d[key] 
      the_geom = {"type": "MultiPolygon", "coordinates": [[coord_list]]} 
      feature = {"type": "Feature", "geometry": the_geom, "name": name, "area": area_list, "properties": property_dict, } 
      feature_list.append(feature) 

     feature_collection = {"type": "FeatureCollection", "features": feature_list} 
+0

есть ряд проблем, один из которых я вижу, что 'float (coord [0])' фактически не изменяет значение на float, вам нужно будет сделать 'coord [0] = float (coord [ 0]), чтобы изменить его. –

+0

также: 'coord_list = d [" координат "]; coord_list.append (d ["координат"] [0]) 'это добавит дубликат записи первого элемента в конец списка, это желательно? –

+0

Преобразованный код не мой, и на самом деле он отлично работал около 2 часов назад, с тех пор я ничего не изменил ни в одном коде, и теперь он не работает – user6240030

ответ

1

Вы испытываете проблемы, вызванные переменной повторного использования.

Каждый пробег через for d in mylist: изменяет property_dict, который затем добавляется к feature_list. В следующий раз через цикл вы измените тот же, который перезаписывает предыдущие данные. Перемещение property_dict = {} во внешний цикл устранит эту проблему.