Python 在arcgis中将线显示为热图

Python 在arcgis中将线显示为热图,python,heatmap,arcgis,Python,Heatmap,Arcgis,我需要在地图上表示一条路线,并给出一个变量的可视化表示。例如,一辆汽车想从a点行驶到B点,我想表示油箱中剩余的燃油量 我已经决定使用ArcGIS来做这件事,但是我找不到一个合适的方法来画一条颜色变化的线。到目前为止,我所做的是每两点创建一条新线并更改其颜色。问题是,在某些情况下,我画了4000多条线,画起来相当慢 这是我现在正在使用的代码示例(我正在使用python): 这就是它的样子: 问题是绘制它大约需要5分钟,我需要更快的速度。您面临的最大挑战是符号依赖于特定属性(例如,高程或剩余燃油)

我需要在地图上表示一条路线,并给出一个变量的可视化表示。例如,一辆汽车想从a点行驶到B点,我想表示油箱中剩余的燃油量

我已经决定使用ArcGIS来做这件事,但是我找不到一个合适的方法来画一条颜色变化的线。到目前为止,我所做的是每两点创建一条新线并更改其颜色。问题是,在某些情况下,我画了4000多条线,画起来相当慢

这是我现在正在使用的代码示例(我正在使用python):

这就是它的样子:


问题是绘制它大约需要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,
)