问题标签 [sfnetwork]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sf - 向 sfnetwork 添加空间显式边
我在 R 中有一个带有空间隐式边缘的 sfnetwork。我想使用 tmap 绘制它,因此我想通过将边缘变成线条来使边缘在空间上明确。
我创造了这个怪物来做到这一点
可能需要 MULTIPOINT 演员表,因为图中存在自循环,我假设在 st_union 下,它变成了 POINT,而不是 MULTIPOINT,这让 LINESTRING 演员感到沮丧。
这看起来真的很尴尬,它创建了一个单独的对象,我无法将其粘回 sfnetwork。
我应该怎么做呢?
r - 用点分割线串并在 R 中分配新的段 ID
我正在尝试使用水坝(点)将河流(线)分成水坝之间的连接段。
这里的答案最接近我想要达到的目标。问题是st_split
使用多边形边界作为“刀片”,因此将一条线分成三条而不是两条。我还想为每个点之间的线段分配一个通用 ID。
期望的输出
这是我尝试过的。对于这个例子,结果应该有 9 个特征。
但结果并不如预期。
数据
r - 从点列表创建路线并在R中的路段/道路网络上覆盖路线(点列表)
我有一个道路网络 shapefile 和点列表。我必须从点列表中创建一条路线,然后覆盖/空间连接(整合覆盖路段的点的属性)
示例路网形状文件可在此处找到https://drive.google.com/drive/folders/103Orz6NuiWOaFoEkM18SlzFTjGYi1rju?usp=sharing
以下是带有 lat (x) 和 long (y) 信息的点的代码。“顺序”列表示路线中目的地的顺序。
我想要的输出是按上述顺序连接所有点的路线层。而且我还想整合/对路段进行空间连接。
提前致谢
r - 指定哪个节点是简单 sfnetworks 中的根节点
我有一个具有空间显式边的有根树,它只包含一个边和两个节点。
数据
当我检查哪个节点时,node_is_root()
我发现它是第一个节点。
有没有可能反过来呢?
期望的输出
注意:模式必须"in"
在调用图上的st_network_path()
或st_network_cost()
等其他函数时使用,因为每个节点都代表河流的源头或河口,因此如果在"out"
只有一条边的情况下切换到模式,结果将不正确。
r - R:获取 igraph 属性到边缘 id:运行时间慢。有没有办法让它更快?
我正在计算 sfnetwork my_sfn中两点之间的最短路径。
计算出的路径由保存在可变路径中的图形 id和 I 组成,并希望获得连接到这些 id 的几何图形(gps 值)。
这是通过以下方式完成的:
整个区块:
首先我得到开放的街道地图数据:
然后我设置起点和终点:
计算路径:
在这里我想得到这条路径的几何形状。
但是这最后一个电话需要很长时间。有没有办法让它更快?
r - 使用 sfnetworks 和 r 对河网计算进行排序
我在sfnetworks
. 它来源于流网络的线形文件。对于流网中的每条支流,显然都有起止节点来sfnetworks
决定,但线路上也有连接起止节点的节点。为简单起见,我将采用在这个问题中开发的示例网络。
当你在溪流上游移动时,我正在求解一个方程,从河流出口开始。我会尽可能多地为您保存有关该方程式的详细信息,但本质上是:
我正在hx
根据节点属性在每个节点 x 处求解。
N
,dX
,K
和L
都是在我们开始计算之前已知的固定参数。N
,K
对于所有节点都是固定的,它们永远不会改变。dX
是节点特定属性。h0
并且L
是边缘特定的属性(它们对于边缘上的所有节点都是相同的)h0
由用户在计算开始时定义,但随着您在上游遍历网络时发生变化,当新边收敛时在末端节点发生变化。h0
最初设置为 10,N = 0.5,K = 1500。为了简单起见,我们将说每条边长 100m。
dX
只是反映每个边缘的距离。每条边上的下游节点,dX = 0
。每条边上的上游节点,dX = 100
。L
反映了一个通道上游的总距离edge
,加上那个的总长度edge
。
我想在边缘 a的下游节点开始计算h0 = 10
。
hx
在该起点计算,然后在沿边的每个节点计算(在此示例中仅显示起点和终点节点),直到到达边 g和边 b合并形成边 a的交界处。在边 a 的那个端点:
在边缘 g和边缘 b的这个交界处,我想更新
h0
以反映在边缘 ahx
的终点计算的结果,因此为 13.03。该值将用于边g和边 b。hx
h0
我现在想对每个子网进行这个计算。我将从边缘 b开始的子网开始。
h0
已更改为 13.03,我们计算边 bhx
上的节点,然后到达边 c和边 d的交界处。在边 b的那个端点:
h0
为边 c和边 d更新,以反映hx
边b的端点 (14.13)hx
为边 d上的所有节点计算,并再次在边 c上计算。- 在边 c的端点处,
h0
更新以反映边 e和边 fhx
的交界处
hx
最终计算边缘 e和边缘 f上的所有节点,使用在边缘 chx
的端点计算的. 这样就完成了该子网的遍历。h0
我们返回边 g来计算
hx
从那里开始的子网。从前面的计算中我们知道,边 a
hx
的端点是 13.03。我们现在想再次反映从边 g开始遍历子网络的这个值。h0
当我们到达边 h和边 i的节点交汇点时,我们再次更新
h0
以反映在边 ghx
的终点处计算的值。
- 这是
h0
用于边 h和边 i的值。我们hx
在边 i上计算,然后在边 h上计算。h0
最后一次更新边缘 j和边缘 k合并以反映在边缘 hhx
的端点处计算的值。
在对边 j和边 k上的所有节点进行最终更新后h0
,hx
计算 , 。
总而言之,h0
当您向上游移动到新边缘时,需要更新以反映hx
直接下游边缘的最大值。必须达到一定的解决顺序,在解决任何边缘(第一条边缘之外)之前,您需要知道该ho
段的 ,这意味着您必须首先解决下面的边缘,以确定hx
要使用的.
我一直在努力想出一个循环/迭代/递归解决方案来解决这个计算,从表面上看,它应该很容易解决。单个引流线程的解决方案很容易手动完成,但是当它扩展到整个网络时,必须解决这些排序问题。当网络中有数千条边时,手动进行这些计算将不是一种选择。
这种类型的计算顺序在许多基本水文分析中非常常见(计算河流顺序、河流大小、计算上游贡献面积等)。
sfnetworks
并且 tidygraph
似乎非常适合进行这种类型的计算,但是在水文网络上的示例应用程序很少(大多数图形分析工具都适用于道路网络,考虑到用户数量的差异,这是完全有意义的)。
我试图让它尽可能地重复,如果需要更多,我会很乐意提供,鉴于问题的概念性更强,这很难做到。
r - 从 sf 线串对象创建具有正确索引标签的 inla.graph 对象
我有一个包含linestrings
描述巴西城市之间连接的 shapefile。我想将这些连接转换为将城市代码设置为行名的邻域对象,使其与我的数据框兼容:
因此,行名称将设置为origin_code
,而邻居将dest_code
在列表中设置为,反之亦然(最终这将更改为我创建的索引,但这会使事情更容易检查)。本质上,我需要linestring
以下用于多边形的代码的等效项:
(shp
是一个由多边形组成的 shapefile,并且该index
变量同时存在于 shapefile 和数据框中)。
到目前为止,我已经使用sfnetworks
andigraph
包创建了一个邻域对象,但还不能将索引值附加到行名:
默认情况下,该函数as_sfnetwork
为网络中的每个节点分配一个数字(在边缘数据中,这些是变量 'from' 和 'to' 并且不能使用 mutate 进行更改):
然后,这些值在使用和nb
创建的对象的下一步中用作行名称。有谁知道如何附加我自己的索引甚至提取已创建的索引,以便我可以使其与数据框保持一致?我试图创建一个采用/和/但它们不匹配的转换表,该值是两个索引中的最低值,因此并不总是我数据中的来源。as_adjacency_matrix
mat2listw
from
origin_code
to
dest_code
from
更难的是,比预期多 57 个节点,我不知道为什么会发生这种情况。我检查了重复项,它们在数据中具有相同的坐标和代码/名称,但使用不同的索引号单独处理。
总之,我想将线串对象转换为可用于 INLA 模型的邻域对象,在该模型中,由线连接的城市被视为邻居。我需要为这些城市附加一个索引,以便邻域对象将索引设置为行名,并且它可以与模型中的数据结合。希望这是有道理的,如果没有,请告诉我!
r - R:返回所有简单路径的边列表
我正在尝试使用 tidygraph 获取两个节点之间的路径边缘列表。这是一个例子
我使用 igraph 包中的 all_simple_paths 来获取节点 B 和节点 C 之间的所有可能路径。
我想知道如何为所有简单路径生成边列表。谢谢你。