python - Ошибка расчета длины в объектах LineString - PullRequest
0 голосов
/ 13 января 2020

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

1) При попытке присвоить несколько LineString объектов объекту MultiLineString я столкнулся с трудностями. Идея состоит в том, чтобы создать name в зависимости от фидера (fdr) и использовать его в качестве переменной в объекте MultiLineString. Были опробованы различные методы (например, globals () [], понимание списка, ..), но генерирование ошибок или подобное приведенному ниже коду дает AssertionError. Проблема в том, что namen создает строковые объекты 'l_6_1', 'l_6_2', .. , в то время как переменные l_6_1, l_6_2, .. являются обязательными. (Решено)

2) Мой второй вопрос связан с вычислением длин, где gdf читается с espg:4326, я применил преобразование в объекте класса (который изменяет объект LineString! --This был проверен), в то же время результат из print(lengte) не затронут .. Есть идеи, где мои ошибки?

class Lines:
    def __init__(self, fdr, node, gdf):

        j= 1
        lines= {}
        gdf= gdf.to_crs({'init': 'epsg:3857'})

        for i, k in zip(node[0::2], node[1::2]):
            name= 'l_'+str(fdr)+'_'+str(j)
            lines[name]= LineString([gdf.loc[i][['X', 'Y']], gdf.loc[k][['X', 'Y']]])
            lengte= lines[name].length 
            print(lengte)
            j= j+1

        lines= pd.Series(lines)
        s= lines.values

        f= geometry.MultiLineString([l_6_0]+ list(s))
        self.f = ops.linemerge(f)

Далее я добавляю это на карту и сохраняю (& экспорт), так как я работаю со Spyder.

x= Lines(6, nodes_6, gdf6)  
folium.GeoJson(x.f).add_to(m)
m.save(os.path.join(dest, "grid.html"))

1 Ответ

0 голосов
/ 13 января 2020

@ LuisBlanche при проверке свойств values() Я заметил, что это применимо к фреймам данных и , а не словарям. Ответ на первую проблему решается путем применения s= lines.values и дальнейшего нарезки его в виде списка в MultiLineString.

class Lines:
    def __init__(self, fdr, node, gdf):

        j= 1
        lines= {}
        gdf= gdf.to_crs({'init': 'epsg:3857'})
        for i, k in zip(node[0::2], node[1::2]):
            name= 'l_'+str(fdr)+'_'+str(j)
            lines[name]= LineString([gdf.loc[i][['X', 'Y']], gdf.loc[k][['X', 'Y']]])
            lengte= lines[name].length 
            print(lengte)
            j= j+1

        lines= pd.Series(lines)
        s= lines.values

        f= geometry.MultiLineString([l_6_0]+ list(s))
        self.f = ops.linemerge(f)
...