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}
есть ряд проблем, один из которых я вижу, что 'float (coord [0])' фактически не изменяет значение на float, вам нужно будет сделать 'coord [0] = float (coord [ 0]), чтобы изменить его. –
также: 'coord_list = d [" координат "]; coord_list.append (d ["координат"] [0]) 'это добавит дубликат записи первого элемента в конец списка, это желательно? –
Преобразованный код не мой, и на самом деле он отлично работал около 2 часов назад, с тех пор я ничего не изменил ни в одном коде, и теперь он не работает – user6240030