У нас есть слой с именем Hydrography, который является акваторией для данного задания. У меня есть точка станции и целевая точка. Мне нужно вычислить расстояние между этими двумя точками, но внутри гидрографии. (лодки не могут пересечь землю)
Вычисление расстояния DefenseService выглядит сносно, но кажется, что оно выполняется по прямой линии, поскольку оно не принимает растр в качестве входных данных. Евклидов, кажется, почти там, но я не могу найти ничего прямого.
Я использую ArcGIS Explorer 2500, ArcGIS for Server 10.1 SP1 Enterprise, и мы пишем наши сервисы и инструменты на C #.
У меня есть загрузка гидрографии, создание IPoints, но я не знаю, что делать дальше!
Любая помощь приветствуется, пожалуйста.
arcgis-server
arcgis-10.1
c#
distance
arcgis-explorer
SASS_Shooter
источник
источник
Ответы:
Используйте инструменты Cost Distance и Cost Path из расширения Spatial Analyst.
Вы можете создать растр из ваших гидрографических полигонов. Затем убедитесь, что растровые ячейки, представляющие воду, получают низкое значение (например, 1), а другие растровые ячейки получают высокое значение (например, 1000). Затем вы можете использовать этот растр в качестве растрового расстояния в инструменте Path Path .
источник
Я сделал нечто подобное для осевых линий над каналами и естественными водотоками. Подход, который я использовал, заключался в том, чтобы TIN точек, разделить пополам TIN, затем создать второй TIN из исходных вершин и биссектрис, а затем пройти, используя модифицированный алгоритм Дейкстры, отбрасывая опции, как только становится очевидным, что они не будут формировать самое простое решение , Модификация заключалась в том, что линия могла заканчиваться в точке «решения» или на предыдущем пути, если он уже существует. Для этого не существует готового решения, и если вы не программист или, по крайней мере, не в состоянии получить хорошую сторону от одного, единственный вариант - это проследить со смещением в базу геоданных и посмотреть на поле shape_length.
TIN = треугольная нерегулярная сеть, решетка из точек и соединительных линий, так что каждая точка соединена с ближайшими соседями и никакие линии не пересекаются. Для этого см. Http://en.wikipedia.org/wiki/Delaunay_triangulation . Я не использовал объекты ESRI TIN, вместо этого я нашел некоторый код для триангуляции и сохранил их в памяти, что-то вроде http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation ,
Для кратчайшего алгоритма пути см http://en.wikipedia.org/wiki/Dijkstra «s_algorithm имеет хорошую картину; несмотря на сложное название, это действительно довольно просто.
Из точек, образующих линии, я сделал триангуляцию Делоне, затем нашел среднюю точку каждого ребра треугольника (базовая геометрия ... среднее значение X, среднее значение Y) и затем вставил точки, которые попадали в полигоны, в сетку, которая дает центр пути и ссылки на все вершины на границе. Затем, исключая грани, которые следуют по берегам водотока, проследите сеть, используя алгоритм Дейкстры, и вы в конечном итоге найдете путь из точки А в точку Б, проходящий примерно по центру водотока. Будет много возможных путей, поэтому я держал вес на каждой вершине и останавливал путь, когда совокупная длина превысила уже записанную длину, и, если она была меньше, обновляю вершину с более короткой совокупной длиной - это уменьшает количество пути, которые прослеживаются, и их может быть довольно много;
С другой стороны, после триангуляции вы можете превратить края треугольников в две точечные линии как класс пространственных объектов, построить сеть и затем выполнить трассировку. Я уверен, что процедуры трассировки ESRI намного быстрее, чем у меня, но у меня была конкретная потребность, и я не мог ее решить с помощью геометрических сетей.
источник
Я добавляю это для любого в будущем, кто читает эту ветку.
Вот все, что я узнал, изучая эту проблему и получая полное расстояние между точками вызова.
Наша первая проблема проистекала из статической природы RasterCatalog. Изменение растров, на которых это основано, НЕ меняет растр внутри RasterCatalog. Оказалось, что у нас была древняя версия, которой не было рядом с картой береговой линии. Извлеченный урок: перестраивайте RasterCatalog КАЖДЫЙ РАЗ, когда вы меняете растры, на которых он основан.
Растр расстояния с добавленными весами становится довольно громоздкой для работы. Посмотрите на следующий сценарий: Исходное значение растра составляет 1 общее расстояние, на которое я хочу посмотреть, составляет 117 км. Размер ячейки 1 метр. Если растр теперь имеет взвешенное значение 48, то общее расстояние, которое я хочу посмотреть, составит 117 км * 48 !!! Таким образом, расстояние в методе CostDistance - это не расстояние до ячейки, а взвешенное расстояние, по-видимому, добавляя значение в каждой ячейке, пока сумма каждой ячейки не станет равной значению, пройденному для общего расстояния. Даже если сам размер ячейки составляет 1 метр !!!
Растр расстояния все сфокусирован на точке происхождения. Поэтому, когда вы вызываете подпрограмму CostDistance, вы не хотите включать точку отправления в этот список. если вы это сделаете, вы получите одно очко с расстоянием 0 (это даже тупая поддержка ESRI)
В то время как многие методы используют Envelope для ограничения своего процесса, два самых дорогих из них: установка значения для растра и извлечение растра без области внутри многоугольника, игнорирование всех настроек огибающей и автоматическое применение этого всегда ко всему растру. К сожалению для нас, мы можем сократить это только путем создания массивных перекрывающихся сегментов и назначения сегмента определенной области в штучной упаковке. Но при этом мы должны быть осторожны (что сложно), чтобы основная область операций не существовала в неправильной перекрытой области. (другими словами, все наши перекрытия должны быть тщательно выбраны, чтобы не содержать каких-либо основных точек интереса!) Причина этого заключается в том, что мы перемещаемся по RasterCatalog, выбирая правильный растр в зависимости от того, где существует выбранная станция береговой охраны. Чтобы еще больше усложнить наш процесс, Перекрытие должно позволить нам перемещаться на расстояние до 120 км от нашей исходной точки, не сходя с края карты и не перекрывая другие основные достопримечательности. Sheesh.
Единственное, что я узнал, это то, что легко растянуть математику, но когда вы хотите либо «проткнуть дыру» в растре (блокировки), либо установить пончик со значением, а внутри пончика есть Значение 1 (задержка, как в случае блокировки) приводит к сложной комбинации инструментов и вызовов ArcObject. Что приводит к последнему уроку: ArcObjects не может делать все. Поэтому я иногда вынужден делать что-то с помощью медленных, громоздких инструментов, написанных на python. Я также узнал, что разработчики инструментов ESRI ничего не знали о поддержании согласованности. Иногда они брали растровую базу данных, а иногда им требовался растр, а иногда - набор функций. И они не возвращают данные в том же формате, который требуется для ввода!
Смущенный? Не волнуйся, это ESRI.
источник