【问题标题】:python - Error calculating length in LineString objectspython - 在 LineString 对象中计算长度时出错
【发布时间】:2020-04-30 07:35:09
【问题描述】:

目前在编写下面显示的代码时处理两个错误,我想知道是否有人可以帮助我或提供一些解决它们的提示,谢谢。

1) 尝试将多个 LineString 对象分配给 MultiLineString 对象时遇到了困难。这个想法是根据馈送器(@9​​87654324@)创建一个name,并将其用作MultiLineStringobject 中的变量。尝试了不同的方法(例如 globals()[]、列表理解、..),但在下面的代码中生成错误或类似的方法给出了AssertionError。问题是 namen 生成字符串对象 'l_6_1', 'l_6_2', .. 而变量 l_6_1, l_6_2, .. 是必需的。 (已解决)

2) 我的第二个问题与计算长度有关,其中gdf 是用espg:4326 读取的,我在类对象中应用了转换(这会更改 LineString 对象!--这已被检查),同时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"))

【问题讨论】:

  • l_6_0 是 LineString 吗?在这种情况下,你的名字列表中的项目也应该是 LineStrings .. 所以也许你做了类似的事情:f = geometry.MultiLineString([l_6_0] + lines.values())
  • @LuisBlanche 确实是LineString,我也尝试过,但给了我TypeError: 'numpy.ndarray' object is not callable。可能需要注意:当使用lines['l_6_1'], lines['l_6_2'], ..., lines['l_6_X'] 而不是namen 时,不会发生错误,并且地图会显示所有行。
  • 我的错误:然后尝试f = geometry.MultiLineString([l_6_0] + list(lines.values())

标签: python python-3.x geopandas shapely multilinestring


【解决方案1】:

@LuisBlanche 在检查 values() 的属性时,我注意到这适用于数据框和 not 字典。第一个问题的答案是通过应用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)

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 2021-11-12
    • 2013-06-15
    • 2019-12-06
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多