我想将MULTILINESTRING
几何类型与POINT
几何类型进行比较。
为了测试MULTILINESTRING中的(XY)与POINT中的(XY)是否匹配。
基本上MULTILINESTRING
类型看起来像这样:MULTILINESTRING((918844.55 6670885.31,918778.87 6670898.9, 918502.96 6670936.35))
,(XY)坐标数可以大于3。
POINT
的类型如下:POINT(920892.39 6671627.92)
,但是(XY)坐标的数量相同。
我从postgreSQl数据库中获得了这些数据,检索它们或解析每种几何类型都没有问题,但这是为了对它们进行比较。
我遇到的困难是当我获得MULTILINESTRING
几何类型时,我检索了一个数据集,其中每行都类似于上面的示例。因此,我需要将MULTILINESTRING
几何类型的每个(XY)坐标与每个(XY)POINT
几何类型进行比较。如果值匹配,我想INSERT
(XY)坐标到表。
下面是我的代码和说明:
Sub importcb_smn(ByVal myConnection As System.Data.Odbc.OdbcConnection)
Dim infoDataset As DataSet, infoDataset2 As DataSet
'Here I get MULTILINESTRING type
infoDataset = accessRequet_odbc("select st_astext(st_snaptogrid(geom, 0.01)) from netgeo_cable", myConnection)
'Here I get POINT type
infoDataset2 = accessRequet_odbc("select st_astext(st_snaptogrid(geom, 0.01)) from netgeo_point_tech", myConnection)
Dim t1 As Long = infoDataset2.Tables(0).Rows.Count
Dim t2 As Long
Dim geomCable As String, geomPt(t1) As String, geomSplit(t2) As String
Dim parse1 As String, parse2 As String, parse3 As String
'Here I parse POINT type data to dump it into an array
For i = 0 To infoDataset2.Tables(0).Rows.Count - 1
parse1 = infoDataset2.Tables(0).Rows(i).ItemArray(0).Remove(0, 6)
geomPt(i) = parse1.Substring(0, parse1.Length - 1)
Next
'Here I parse MULTILINESTRING type
For i = 0 To infoDataset.Tables(0).Rows.Count - 1
parse2 = infoDataset.Tables(0).Rows(i).ItemArray(0).Remove(0, 17)
geomCable = parse2.Substring(0, parse2.Length - 2)
geomSplit = Split(geomCable, ",")
'I test if value matches
For j = 0 To UBound(geomPt)
If geomPt(j) = geomSplit(i) Then
Call executeCommand("insert into netgeo_cable_bis(geom) values (st_geometryfromtext('POINT(" & geomSplit(i) & ")',2154))", myConnection)
End If
Next
Next
End Sub
所以我尝试比较2个数组。首先,我将infoDataset2
的每一行解析并转储到geomPt()
中。因此geomPt()
的每一行都是(XY)字符串。
然后我解析infoDataset
的一行并将其转储到geomSplit()
中。但是这里geomSplit()
的每一行只是infoDaset
的1行的(XY)坐标。
这就是为什么我尝试比较同一循环中的原因。用infoDataset
的每一行测试infoDataset2
的每一行的每个(XY)坐标。
我在if geomPt(j) = geomSplit(i) then
处收到一条错误消息:System.IndexOutOfRangeException : The index is outside the limits of the table
。但我看不出如何解决。
我想从中学到东西,所以,如有可能,请向我解释我在这里做错了什么,或者我的方法缺乏见识。
答案 0 :(得分:0)
感谢@JGH,他建议我尝试使用Postgis
函数进行比较。确实,最好让数据库来完成这项工作,因为它是为此而建立的。
因此,我首先进行SELECT
查询,以获取电缆的所有点(其中st_dumppoints()
位于比较点(st_dwithin()
)附近,然后得到索引位置电缆上的每个点以构建新的线串(使用st_line_locate_point()
)。
在VB.NET中,我的查询如下:infoDataset = accessRequet_odbc("SELECT req.id, (dp).geom, netgeo_point_tech.id, ST_Line_Locate_Point(ST_LineMerge(geom_cable), (dp).geom)
FROM (SELECT id, ST_DumpPoints(geom) as dp, geom as geom_cable FROM netgeo_cable_test) as req
LEFT JOIN netgeo_point_tech ON ST_dwithin(netgeo_point_tech.geom, (dp).geom, 1)
ORDER BY req.id, (dp).path [ 1] ASC", myConnection)
然后,我需要解析得到提取索引位置和原始电缆ID的结果。
使用原始电缆的编号和浮点(索引位置),我可以插入新的linsestring
,它是原始电缆的一部分。
如果我的解释合理,请让我认识。