这是ArcGIS的新功能,希望“在鱼游动时”计算两点之间的距离


9

我们有一个名为Hydrography的图层,它是给定任务的水域。我有一个车站和一个目标点。我需要计算这两个点之间的距离,但要计算在水文内部。(船不能越过陆地)

DefenseService距离计算看起来是可以通过的,但是它似乎是一条直线,因为它不使用任何Raster作为输入。欧几里得似乎快要在那里了,但是我找不到任何直接的东西。

我正在使用ArcGIS Explorer 2500,ArcGIS for Server 10.1 SP1 Enterprise,并且我们正在用C#编写服务和工具。

我负责水文学的编写和IPoint的创建,但是下一步该怎么办!

任何帮助,请。


1
有“没有公认的答案”在这里,但我认为这是一个非常类似的问题:gis.stackexchange.com/questions/33799/...
Mapperz

我的兴奋程度立即开始上升,直到他说自己不是程序员。这不能使用工具来完成。我有一个带有选定位置和目标列表的自定义工具窗口。我需要在服务器上调用一个方法,并在列表中填入到每个目标的距离。
SASS_Shooter 2013年

您的水文图层是线还是多边形?
2013年

这是我们转换为栅格的多边形。
SASS_Shooter

您的用例有点混乱。您是否要寻找沿湖边的两个点的最短距离?还是您的车站与河流车站(在湖底)相对应?
DPierce

Answers:


4

使用Spatial Analyst扩展中的“ 成本距离”和“成本路径”工具

您可以从水文多边形创建栅格。然后确保代表水的栅格像元的值较低(例如1),其他栅格像元的值较高(例如1000)。然后,您可以在“ 成本路径工具”中将此栅格用作成本距离栅格


是的-我发现“成本距离”将栅格作为输入,并将水文栅格上的点作为起点和终点。返回的值是一个多义线,我可以从中获取长度。
SASS_Shooter 2013年

1

对于运河和天然水道的中线,我做了类似的事情。我使用的方法是对点进行TIN,将TIN对等,然后从原始顶点创建第二个TIN,然后等分线遍历,然后使用修改的Dijkstra算法丢弃选项,只要很明显它们将不会构成最简单的解决方案。修改是,该行可以在“解决方案”点终止,也可以在上一条路径已经存在的情况下终止。没有开箱即用的解决方案,如果您不是程序员,或者至少不能站在一个好的方面,那么您唯一的选择是使用偏移量跟踪到地理数据库并查看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。尽管名称复杂,但实际上非常简单。

从形成直线的点开始,我进行了Delaunay三角剖分,然后找到了三角形各边的中点(基本几何...平均X,平均Y),然后将落在多边形内的点插入到网格中,从而得到一个中心路径并链接到边界上的所有顶点。然后,使用Dijkstra的算法排除沿河道两岸的小面来跟踪网络,您最终将找到一条从A点到B点的路径,该路径大约沿着水道的中心延伸。会有很多可能的路径,因此当累积长度超过已记录的长度时,我会在每个顶点上保持权重,并停止路径,如果路径长度较小,则以较短的累积长度更新顶点-这会减少被追踪的路径,可能有很多;

或者,一旦进行了三角剖分,就可以将三角形的边缘变成两条点线作为要素类,构建网络,然后进行描画。我确信ESRI跟踪例程比我的要快得多,但是我有特定的需求,无法使用几何网络解决它。


迈克尔-我是C#开发人员。只是ArcGIS及其编程工具的新手。我已经使用Military Analyst找到了一种开箱即用的解决方案,但是ESRI尽其所能将其丢弃。您用TIN表示什么意思,使用了哪种Dyjkstra算法?
SASS_Shooter

1

我将为将来阅读此线程的任何人添加此代码。

这是我在深入研究此问题并获得点之间的完整距离时所学的所有知识。

我们的第一个问题源于RasterCatalog的静态性质。更改基于该栅格的栅格不会更改RasterCatalog内部的栅格。事实证明,我们的地图远比海岸线地图远。获得的经验教训:每次更改其基础的Raster时,都要重新构建RasterCatalog。

添加了权重的“距离栅格”变得相当麻烦。请看以下情况:栅格的原始值是1我要看的总距离是117 km。像元大小为1米。如果栅格现在的加权值为48,那么我要查看的总距离将变为117 km * 48!因此,CostDistance方法中的距离不是像元距离,而是加权距离,显然是将每个像元中的值相加,直到每个像元的总和=为总距离传递的值。即使单元格大小本身是1米!!!

距离栅格都集中在原点上。因此,当您调用CostDistance例程时,您不想在该列表中包括起点。如果这样做,您将得到一个距离为0的点。(这甚至阻碍了ESRI的支持)

尽管许多方法都使用“信封”来限制其处理过程,但最昂贵的两种方法是为栅格设置一个值,并提取一个多边形内没有区域的栅格,而忽略所有信封设置,并自动将其始终应用于整个栅格。对于我们来说不幸的是,我们只能通过创建大量重叠的线段并将线段分配给特定的装箱区域来缩短此时间。但是在这样做时,我们必须小心(这很难),在错误的重叠区域中不存在主要操作区域。(换句话说,必须仔细选择所有重叠部分,以使其不包含任何主要兴趣点!)其原因是,我们导航RasterCatalog,并根据所选海岸警卫队所在的位置选择正确的栅格。为了进一步简化我们的流程,重叠部分必须使我们能够在距出发点120公里的范围内导航,而不会偏离地图的边缘并且不会与其他主要兴趣点重叠。嘘。

我了解到的唯一其他事情是,对栅格进行数学运算很容易,但是当您想在栅格中“戳个洞”(障碍物)或设置一个具有值的甜甜圈并且该甜甜圈的内部具有一个值1(像锁一样延迟),最终会导致工具和ArcObject调用的复杂组合。这就得出了最后的教训:ArcObjects不能做任何事情。因此,有时我不得不用慢速,繁琐的工具(都是用python编写)来做事。我还了解到ESRI工具开发人员对保持一致性一无所知。有时他们在其他时间获取栅格数据库,有时需要栅格,有时需要要素集。而且,它们不会以输入所需的格式返回数据!

困惑?不用担心,这是ESRI。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.