Я пытаюсь создать объект GeoJSON. Мой вход - csv с столбцом адреса, столбцом lat и столбцом lon. Затем я создал точки Shapely из координат, буферизую их на заданный радиус и получаю словарь координат через опцию сопоставления - пока что так хорошо. Затем, обратившись к этому вопросу, я написал следующую функцию, чтобы получить серию словарей:
def make_geojson(row):
return {'geometry':row['geom'], 'properties':{'address':row['address']}}
и я применил его так:
data['new_output'] = data.apply(make_geojson, axis=1)
Мой итоговый столбец заполнен: <built-in method values of dict object at 0x10...
Самая странная часть заключается в том, что когда я напрямую вызываю функцию (т.е. make_geojson(data.loc[0])
, я действительно получаю словарь, который я ожидаю. Возможно, даже страннее, когда я вызываю функции, которые я получаю от apply ( например data.output[0]()
, data.loc[0]['output']()
) Я получаю эквивалент следующего списка: [data.loc[0]['geom'], {'address':data.loc[0]['address']}]
, то есть значения (но не ключи) словаря, который я пытаюсь получить.
Для тех из вас, кто играет дома, вот пример игрушки:
from shapely.geometry import Point, mapping
import pandas as pd
def make_geojson(row):
return {'geometry':row['geom'], 'properties':{'address':row['address']}}
data = pd.DataFrame([{'address':'BS', 'lat':34.017, 'lon':-117.959}, {'address':'BS2', 'lat':33.989, 'lon':-118.291}])
data['point'] = map(Point, zip(data['lon'], data['lat']))
data['buffer'] = data['point'].apply(lambda x: x.buffer(.1))
data['geom'] = data.buffer.apply(mapping)
data['output'] = data.apply(make_geojson, axis=1)