Как применить эту функцию ко всему фрейму данных геопанды и вернуть новый фрейм данных со всеми совпадениями? - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно применить следующую функцию ко всем точкам в GeoDataFrame

def radius(gpd_df, cpt, radius=0.01):

    sindex = gpd_df.sindex
    bbox = (cpt.geometry.x-radius, 
            cpt.geometry.y-radius, 
            cpt.geometry.x+radius, 
            cpt.geometry.y+radius)

    good = []
    for n in sindex.intersection(bbox):
        dist = cpt.geometry.distance(gpd_df['geometry'][n])
        if dist<radius:
            good.append((cpt[0],dist,n))

    good.sort() 

    return [x for x in good]

, но обратите внимание, что может быть возвращено более одного совпадения на входную точку, поэтому я должен создать новый DataFrame.

Я тестирую функцию с test = radius(df.iloc[0], aa, 0.011), но у меня такое чувство, что, хотя это дает мне правильные ответы, оно не обобщается (и даже не уверено, что это правильно).

1 Ответ

0 голосов
/ 01 ноября 2019

Итак, вот мое решение проблемы, хотя я был бы очень признателен, если бы кто-то мог сделать его более симпатичным или более питоническим, или сказать мне, если есть ошибка. Я еще точно не понимаю, что я здесь делаю.

Итак, у меня есть GeoDataFrame с именем gpd, в котором есть информация и shapely.Point с. Функция завершилась так (взято из здесь , с благодарностью):

def radius2(gpd_df, cpt, radius):
    sindex = gpd_df.sindex

    bbox = (cpt[1].x-radius, 
            cpt[1].y-radius, 
            cpt[1].x+radius, 
            cpt[1].y+radius)

    good = []
    for n in sindex.intersection(bbox):
        dist = cpt[1].distance(gpd_df['geometry'][n])
        if dist<radius:
            good.append((cpt[0],dist,n))

    good.sort() 

    return good

Теперь я называю это как

results = [radius2(aa, x, 0.01) for x in gt.values]

, что дает мне список списковиз кортежей, которые, в свою очередь, я просто

def functools_reduce_iconcat(a):
    return functools.reduce(operator.iconcat, a, [])

red = functools_reduce_iconcat(results)
df = pd.DataFrame(red)

Я знаю, это не красиво, но сейчас это придется делать. Пожалуйста, предоставьте конструктивную критику.

...