微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在arcgis中将一条线显示为热图

如何解决在arcgis中将一条线显示为热图

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

我已决定使用 ArcGIS 来完成此操作,但找不到合适的方法来绘制颜色变化的线。到目前为止,我正在做的是每两个点创建一条新线并改变它的颜色。这样做的问题是,在某些情况下,我要绘制 4000 多条线,而且绘制速度很慢。

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

max_elevation = activity_data["Elevation"].max()
min_elevation = activity_data["Elevation"].min()
range_elevation = max_elevation - min_elevation
for index,row in activity_data.iterrows():
    actual_row = activity_data.loc[index]
    next_row = activity_data.loc[index+1]
    if index != activity_data.size:
        sym_poly_aoi = {
        "type": "esriSFS","style": "esriSFSSolid","color": [0,0],"outline": {
            "type": "esriSLS","style": "esriSLSSolid","color": [(actual_row["Elevation"]-min_elevation)/range_elevation*255,255],"width": 3}
        }
        line = {"paths" : [[[actual_row["Longitude"],actual_row["Latitude"]],[next_row["Longitude"],next_row["Latitude"]]]]}
        polyline = polyline(line)
        map2.draw(polyline,symbol = sym_poly_aoi)

这是它的样子:

enter image description here

问题是绘制它需要大约 5 分钟,我需要更快的速度。

解决方法

您面临的最大挑战是符号系统依赖于特定属性(例如 elevationfuel_remaining)。单个线段对于一个属性只有一个值,而许多小线段每个都具有相同属性的唯一值。例如,从 A 到 Z 的完整路线可以具有 elevation100 -- 但它的梯度表示具有 A 到 B(elevation25) ,B 到 C(elevation30),C 到 D(elevation35)...

symbolize a line with a gradient along its length 有一个 ArcGIS Pro Idea 可能满足您的需求,但尚未实施。所以这只是一个有趣的旁注,而不是答案!)

与其尝试符号化单个要素,不如只关注脚本中的属性,然后单独进行符号系统渲染。 (构建多段折线仍然需要一些时间,但如果你只是让它计算几何和属性而不是让它渲染线段,它应该比你当前的方法更快。)一旦几何/属性是完整的,你可以用 graduated color symbology 显示。让渲染器使用内置函数进行数学运算,而不是自己编写代码。

(顺便说一句,我确实喜欢你为解决这个问题而编写的脚本,并且可能会借用我正在从事的一个副项目的概念。但我也完全理解需要快速发生的事情!)>

,

最后,我们决定使用另一个 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

我们将函数应用于我们的数据:

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,)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。