如何在VB.NET中将MULTILINESTRING几何类型与POINT几何类型进行比较?

时间:2019-05-24 09:12:18

标签: vb.net postgis

我想将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。但我看不出如何解决。

我想从中学到东西,所以,如有可能,请向我解释我在这里做错了什么,或者我的方法缺乏见识。

1 个答案:

答案 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,它是原始电缆的一部分。

如果我的解释合理,请让我认识。