Python 在arcgis中将线显示为热图
我需要在地图上表示一条路线,并给出一个变量的可视化表示。例如,一辆汽车想从a点行驶到B点,我想表示油箱中剩余的燃油量 我已经决定使用ArcGIS来做这件事,但是我找不到一个合适的方法来画一条颜色变化的线。到目前为止,我所做的是每两点创建一条新线并更改其颜色。问题是,在某些情况下,我画了4000多条线,画起来相当慢 这是我现在正在使用的代码示例(我正在使用python): 这就是它的样子:Python 在arcgis中将线显示为热图,python,heatmap,arcgis,Python,Heatmap,Arcgis,我需要在地图上表示一条路线,并给出一个变量的可视化表示。例如,一辆汽车想从a点行驶到B点,我想表示油箱中剩余的燃油量 我已经决定使用ArcGIS来做这件事,但是我找不到一个合适的方法来画一条颜色变化的线。到目前为止,我所做的是每两点创建一条新线并更改其颜色。问题是,在某些情况下,我画了4000多条线,画起来相当慢 这是我现在正在使用的代码示例(我正在使用python): 这就是它的样子: 问题是绘制它大约需要5分钟,我需要更快的速度。您面临的最大挑战是符号依赖于特定属性(例如,高程或剩余燃油)
问题是绘制它大约需要5分钟,我需要更快的速度。您面临的最大挑战是符号依赖于特定属性(例如,
高程
或剩余燃油
)。单个线段对于属性只有一个值,而许多小线段对于同一属性都有唯一的值。例如,从A到Z的整条路线可以具有标高100
——但其坡度表示具有A到B(标高标高标高标高标高标高标高标高标高30
),C到D(标高标高标高标高标高标高35
)
(有一个ArcGIS Pro的想法可能适合您的需要,但尚未实施。因此,这只是一个有趣的旁注,不是答案!)
但是,您可以只关注脚本中的属性,然后让符号单独呈现,而不是尝试对单个功能进行符号化。(构造多段多段线仍然需要一些时间,但如果只是让它计算几何图形和属性,而不是让它渲染线段,则应该比当前的方法快。)几何图形/属性完成后,可以直接显示。让渲染器使用内置函数进行计算,而不是自己编写
(顺便说一句,我很喜欢你为解决这个问题而编写的脚本,可能会借用我正在进行的一个辅助项目的概念。但我也完全理解需要快速发生的事情!)最后,我们决定使用另一个gis库。在我们的例子中,我们选择使用deck.gl,它也适用于python。您只需要以json格式构造数据。我们使用此函数通过一个额外的参数来执行此操作,该参数将用于更改颜色:
def line_parameter(data,parameter):
formated_data = []
for index in range(len(data.index)-2):
current_row = data.iloc[index]
next_row = data.iloc[index+1]
formated_data.append(
{ parameter: current_row[parameter],
"start":[current_row["Longitude"],current_row["Latitude"],current_row["Elevation"]],
"end":[next_row["Longitude"],next_row["Latitude"],next_row["Elevation"]]}
)
return formated_data
def get_line_colour(data,param):
max_data = data[param].max()
min_data = data[param].min()
multiplier = 255 / (max_data - min_data)
color = [
"(HR - " + str(min_data) + ") * " + str(multiplier) ,
"0",
"255 - (HR - " + str(min_data) + ") * " + str(multiplier),
"255",
]
return color
然后我们使用此函数创建颜色:
def line_parameter(data,parameter):
formated_data = []
for index in range(len(data.index)-2):
current_row = data.iloc[index]
next_row = data.iloc[index+1]
formated_data.append(
{ parameter: current_row[parameter],
"start":[current_row["Longitude"],current_row["Latitude"],current_row["Elevation"]],
"end":[next_row["Longitude"],next_row["Latitude"],next_row["Elevation"]]}
)
return formated_data
def get_line_colour(data,param):
max_data = data[param].max()
min_data = data[param].min()
multiplier = 255 / (max_data - min_data)
color = [
"(HR - " + str(min_data) + ") * " + str(multiplier) ,
"0",
"255 - (HR - " + str(min_data) + ") * " + str(multiplier),
"255",
]
return color
我们将函数应用于我们的数据:
data = pd.read_csv("./some/path")
line_data = get_line_data(data,"HR")
line_colour = get_line_colour(data,"HR")
最后,我们使用LineLayer:
line_layer = pdk.Layer(
"LineLayer",
line_data,
get_source_position="start",
get_target_position="end",
get_color=line_colour,
get_width=10,
highlight_color=[255, 255, 0],
picking_radius=10,
auto_highlight=True,
pickable=True,
)