Как измерить расстояние между точками по высоте?

10

Мне нужно уметь измерять расстояния между точками, однако расстояние нужно вычислять по отношению к высоте. Точки - дома рассказчиков 19-го века и места, которые упоминаются в их рассказах. Таким образом, расстояние должно быть «пешком». Путь вдоль долины, вероятно, будет короче, чем путь через гору, хотя фактическое прямое расстояние короче. Прилагается скриншот, иллюстрирующий мое мышление. Таким образом, на изображении пути A и C будут рассчитаны короче, чем путь B.Точки и высота

Точки взяты из CSV-файла, но у меня также есть растровый слой с данными высоты.

traustid
источник
1
Я думаю, что было бы лучше рассчитать время ходьбы . Скорость ходьбы зависит от уклона, и вверх занимает больше времени, чем вниз.
AndreJ
1
«3D» расстояние по сравнению с расстоянием по плоской карте? Разница, вероятно, меньше, чем вы думаете. Питер Гут, человек, стоящий за MICRODEM, сказал: «Расстояние или площадь будут увеличиваться с помощью угла наклона склона, и до тех пор, пока вы не доберетесь до очень больших склонов, сечение по существу равно 1.»
Ноптон

Ответы:

6

Достижение этой цели является несколько основной задачей в ГИС, однако метод в QGIS может быть не тривиальным. Ваш лучший шанс - использовать r.walkфункцию GRASS , которая создает анизотропную поверхность затрат (dem + slope + другие факторы).

Во-первых, вы должны создать поверхность трения в качестве входа для r.walk. В вашем случае это может быть однозначный растр (1.0), соответствующий экстенту вашей матрицы высот. Вы можете создать его с r.mapcalculatorпомощью формулы: A*0+1где A - ваша матрица высот.

Затем вы должны выбрать набор начальных точек из вашего CSV. Это точки, из которых будет рассчитана поверхность накопленной стоимости. Вы должны создать отдельную поверхность затрат из каждой начальной точки. Может быть целесообразно определить конечные точки, связанные с каждой начальной точкой на этом шаге (в отдельных слоях вне курса). После вы можете запустить r.walkс созданными входами. Начальные точки могут быть в одном слое, вы можете перебирать их с помощью зеленой стрелки в диалоговом окне.

Теперь в идеальном случае у вас есть поверхности затрат и конечные точки для каждой поверхности затрат. Теоретически вы могли бы найти пути с наименьшей стоимостью r.drain, но для меня это привело к ошибке (python не смог импортировать библиотеку QgisRaster). Если вы работаете с той же проблемой, вы можете использовать алгоритм SAGA «Пути наименьшей стоимости». Это создаст точку и линейный слой для каждой конечной точки с поверхностью затрат (снова используйте кнопку итерации). Получив все линии, вы можете объединить их в один шейп-файл с помощью инструмента SAGA «Объединить слои фигур».

Этот метод может быть очень медленным с приращением точек, поэтому, если у вас их много, вы можете попробовать автоматизировать метод с помощью python. Это все еще будет много времени для расчета (особенно поверхности затрат), но вам не нужно создавать тонны слоев конечных точек вручную.

Габор Фаркас
источник
Спасибо за это, мне, вероятно, придется начать изучать, как использовать GRASS. Я также думаю, что у меня могут быть проблемы, на иллюстрации, которую я разместил, я бы предположил, что многие горы непроходимы, поэтому мне пришлось бы добавить что-то вроде «если гора выше х, обойди ее» ... Но спасибо за ответ, это, вероятно, поможет мне начать.
traustid
Это легкое условие r.walk. Вы можете использовать карту трения, чтобы установить непроходимые клетки. Переклассифицируйте свою DEM с r.reclassтакими 1 thru 2000 = 1 2000 thru * = 9999правилами в файле правил (если ваш порог равен 2000м). Таким образом, алгоритм не пропустит ячейки с высокими значениями трения, обойдется дешевле.
Габор Фаркас,
Большое спасибо за это! Я действительно не очень разбираюсь в GRASS, но это действительно отличная отправная точка.
traustid
Пожалуйста. Если честно, я все еще поражен твоей задачей. Это один из лучших примеров того, как ГИС может применяться в самых разных дисциплинах.
Габор Фаркас