【发布时间】:2021-09-03 15:55:35
【问题描述】:
我有一个高程栅格(数字高程模型)。我想找到两个已知点之间最陡峭的下降路径。从一个单元格中,您只能移动到周围的七个单元格(减去前一个单元格),我希望根据最陡峭的下降来选择该单元格。如果所有七个周围的单元格都高于当前单元格,我想选择上升最温和的单元格并继续。所有没有数据的单元格都应该被忽略。我只设法计算了坡度栅格(我知道,这是最简单的步骤),不知道如何从那里开始。
fp <- sp::SpatialPoints(cbind(333350,3060410)) # starting point
lp <- sp::SpatialPoints(cbind(333100,3060600)) # end point
#raster
dput(rast)
new("RasterLayer", file = new(".RasterFile", name = "", datanotation = "FLT4S",
byteorder = "little", nodatavalue = -3.4e+38, NAchanged = FALSE,
nbands = 1L, bandorder = "BIL", offset = 0L, toptobottom = TRUE,
blockrows = 16L, blockcols = 128L, driver = "", open = FALSE),
data = new(".SingleLayerData", values = c(NA, NA, NA, NA,
NA, 1208.45349121094, 1207.15441894531, 1207.19006347656,
1207.94274902344, 1207.89782714844, 1207.94274902344, 1209.11303710938,
1210.1640625, 1208.50305175781, 1209.26330566406, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1208.56213378906,
1207.99792480469, 1207.19848632812, 1207.94274902344, 1207.94274902344,
1208.01794433594, 1208.43347167969, 1208.52490234375, 1210.61877441406,
1209.56994628906, 1212.35241699219, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 1208.55212402344, 1208.19763183594,
1207.61181640625, 1207.9072265625, 1208.43347167969, 1208.53259277344,
1208.56506347656, 1208.56506347656, 1209.91125488281, 1209.72192382812,
1217.07543945312, 1219.02136230469, 1219.72485351562, 1217.35620117188,
1214.68359375, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
1208.24816894531, 1208.21142578125, 1207.71325683594, 1207.91076660156,
1208.19030761719, 1208.56506347656, 1208.53442382812, 1208.56506347656,
1211.30285644531, 1215.82885742188, 1214.61682128906, 1221.67639160156,
1220.3544921875, 1219.9892578125, 1217.69470214844, 1221.14685058594,
1219.81823730469, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
1208.55249023438, 1208.02697753906, 1208.017578125, 1207.400390625,
1208.65942382812, 1208.56506347656, 1208.53625488281, 1208.76940917969,
1208.76940917969, 1208.76940917969, 1208.76940917969, 1209.5849609375,
1217.29479980469, 1222.43395996094, 1220.53955078125, 1222.69262695312,
1221.01965332031, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
1208.05090332031, 1207.9970703125, 1207.96997070312, 1208.05041503906,
1208.76940917969, 1208.76940917969, 1208.76940917969, 1208.76940917969,
1208.76940917969, 1209.5849609375, 1209.5849609375, 1209.5849609375,
1222.4541015625, 1220.85107421875, 1221.82141113281, 1216.05773925781,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1208.44177246094,
1208.52172851562, 1208.26806640625, 1208.46484375, 1208.78295898438,
1207.81494140625, 1208.16723632812, 1208.69140625, 1209.5849609375,
1209.5849609375, 1209.5849609375, 1209.720703125, 1213.89770507812,
1214.76220703125, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 1209.41796875, 1208.56091308594, 1208.10803222656,
1208.53002929688, 1208.42626953125, 1207.88256835938, 1208.81066894531,
1208.83459472656, 1209.5849609375, 1209.52807617188, 1209.81579589844,
1214.59741210938, 1223.80065917969, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1208.49841308594,
1209.14697265625, 1208.54370117188, 1208.89050292969, 1209.81579589844,
1209.81579589844, 1214.78759765625, 1221.84899902344, 1223.90710449219,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 1208.6904296875, 1208.94995117188, 1209.23315429688,
1209.67565917969, 1209.67565917969, 1214.1171875, 1215.07580566406,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, 1208.83178710938, 1208.76831054688, 1209.67565917969,
1209.67565917969, 1211.46594238281, 1214.94274902344, 1215.39904785156,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 1209.25732421875, 1208.86218261719, 1209.048828125,
1209.67565917969, 1209.67565917969, 1211.82763671875, 1215.14599609375,
1215.67370605469, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 1209.06079101562, 1209.17163085938,
1208.79455566406, 1209.67565917969, 1209.67565917969, 1213.59326171875,
1220.58471679688, 1217.48803710938, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1210.30834960938,
1209.05725097656, 1210.30346679688, 1209.67565917969, 1209.67565917969,
1215.83471679688, 1222.40283203125, 1218.2578125, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, 1209.61926269531, 1210.16052246094, 1210.56823730469,
1210.79309082031, 1210.46276855469, 1214.73291015625, 1216.96398925781,
1219.07653808594, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 1209.46716308594, 1209.22875976562,
1210.47521972656, 1210.0283203125, 1210.0283203125, 1212.83312988281,
1216.43481445312, 1219.17358398438, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1210.00036621094,
1209.9521484375, 1209.96520996094, 1210.0283203125, 1210.0283203125,
1213.79821777344, 1217.90661621094, 1219.22473144531, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 1209.54418945312, 1210.26818847656, 1210.0283203125,
1210.03039550781, 1210.0283203125, 1212.66833496094, 1216.18420410156,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 1209.45166015625, 1209.70434570312, 1209.33239746094,
1210.0283203125, 1210.0283203125, 1211.15905761719, 1212.17797851562,
1214.48999023438, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 1209.94604492188, 1210.36206054688,
1210.103515625, 1210.0283203125, 1210.0283203125, 1211.44226074219,
1214.18041992188, NA, NA), offset = 0, gain = 1, inmemory = TRUE,
fromdisk = FALSE, isfactor = FALSE, attributes = list(),
haveminmax = TRUE, min = 1207.15441894531, max = 1223.90710449219,
band = 1L, unit = "", names = "nakkhu_hosp_10m"), legend = new(".RasterLegend",
type = character(0), values = logical(0), color = logical(0),
names = logical(0), colortable = logical(0)), title = character(0),
extent = new("Extent", xmin = 333003.9801, xmax = 333403.9801,
ymin = 3060402.4038, ymax = 3060602.4038), rotated = FALSE,
rotation = new(".Rotation", geotrans = numeric(0), transfun = function ()
NULL), ncols = 40L, nrows = 20L, crs = new("CRS", projargs = "+proj=utm +zone=45 +datum=WGS84 +units=m +no_defs"),
history = list(), z = list())
编辑:回应 nniloc 的回答
我认为它会找到距离最短的路径。我想要的不一样。当我将您的方法应用于不同的栅格时,请参见下图。看起来路径在找到较短的路线时会跳过周围的单元格。
【问题讨论】:
-
如果您有
terrapkg,请查看?terra::terrainarg v = 'flowdir' 或 'TPI' 它通常是如何计算的,如详细信息中所述。 -
谢谢。
terra::terrain确实很有帮助。但我正在努力根据terra::terrain的结果定义一条路径。对前进的道路有什么建议吗? -
另一种使用
topmodel的方法如下所示。 -
采用
deldir的进一步方法,仍有待完成,但草图就在那里。