如何解决在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)
问题是绘制它需要大约 5 分钟,我需要更快的速度。
解决方法
您面临的最大挑战是符号系统依赖于特定属性(例如 elevation
或 fuel_remaining
)。单个线段对于一个属性只有一个值,而许多小线段每个都具有相同属性的唯一值。例如,从 A 到 Z 的完整路线可以具有 elevation
的 100
-- 但它的梯度表示具有 A 到 B(elevation
的 25
) ,B 到 C(elevation
的30
),C 到 D(elevation
的35
)...
(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 举报,一经查实,本站将立刻删除。