python - 计算 LineString 对象的长度时出错
python - Error calculating length in LineString objects
目前在编写如下所示的代码时遇到两个错误,我想知道是否有人可以帮助我或提供一些提示来解决它们,谢谢。
1) 在尝试将多个 LineString
对象分配给一个 MultiLineString
对象时,我遇到了困难。这个想法是根据馈线 (fdr
) 创建一个 name
并将其用作 MultiLineString
对象中的变量。尝试了不同的方法(例如 globals()[]、列表理解、..),但在下面的代码中产生错误或类似的东西给出了 AssertionError
。问题是 namen
产生字符串对象 'l_6_1', 'l_6_2', .. 而变量 l_6_1, l_6_2, .. 是必需的。 (已解决)
2) 我的第二个问题与计算长度有关,其中 gdf
是用 espg:4326
读取的,我在 class 对象中应用了一个转换(它改变了 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"))
@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)
目前在编写如下所示的代码时遇到两个错误,我想知道是否有人可以帮助我或提供一些提示来解决它们,谢谢。
1) 在尝试将多个 LineString
对象分配给一个 MultiLineString
对象时,我遇到了困难。这个想法是根据馈线 (fdr
) 创建一个 name
并将其用作 MultiLineString
对象中的变量。尝试了不同的方法(例如 globals()[]、列表理解、..),但在下面的代码中产生错误或类似的东西给出了 AssertionError
。问题是 namen
产生字符串对象 'l_6_1', 'l_6_2', .. 而变量 l_6_1, l_6_2, .. 是必需的。 (已解决)
2) 我的第二个问题与计算长度有关,其中 gdf
是用 espg:4326
读取的,我在 class 对象中应用了一个转换(它改变了 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"))
@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)