Как сравнить тип геометрии MULTILINESTRING с типом геометрии POINT в VB.NET? - PullRequest
0 голосов
/ 24 мая 2019

Я хочу сравнить MULTILINESTRING тип геометрии с POINT типом геометрии.Чтобы проверить, совпадает ли (XY) из MULTILINESTRING с (XY) из POINT.В основном тип 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 тип геометрии. Я получаю набор данных, где каждая строка похожа на пример выше.Поэтому мне нужно сравнить каждую (XY) координату MULTILINESTRING типа геометрии с каждым (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() - это просто (XY) координаты 1 строки infoDaset.

. Поэтому я пытаюсь сравнивать внутри одного и того же цикла.Чтобы проверить все (XY) координаты каждой строки infoDataset с каждой строкой infoDataset2.

, я получаю ошибку в if geomPt(j) = geomSplit(i) then, говоря: System.IndexOutOfRangeException : The index is outside the limits of the table.Но я не вижу, как это исправить.

Я хочу извлечь уроки из этого, поэтому, если возможно, объясните мне, что я делаю не так, или если мой подход не хватает понимания.

1 Ответ

0 голосов
/ 29 мая 2019

Спасибо @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)

Затем мне нужно проанализировать полученный результат для извлечения позиции индекса и идентификатора исходного кабеля. С идентификатором оригинального кабеля и поплавком (индексная позиция) я могу вставить новый linsestring, который является частью оригинального кабеля.

Дайте мне знать, ребята, если мои объяснения имеют смысл.

...