Я пишу приложение, которое читает и публикует пространственные данные. Поставщик базы данных - MySql, который возвращает массив Byte [] для пространственных столбцов в методе Fill адаптера данных. В отличие от Sql Server, тип данных MySqlGeometry может обрабатывать только одно значение POINT? Мне нужно работать с многоточечными фигурами (например, LINESTRING, POLYGON и т. Д.), И я ищу способ использовать возвращенный массив для извлечения и изменения его общеизвестного текста (WKT), а затем создать новый массив Byte []. Я предложил обходной вариант демонстрации «kludge» (см. Ниже), но для использования функций MySql «GeometryFromText» и «AsText» требуется соединение с базой данных. Одной из функций приложения является предоставление пользователю возможности выполнять значительную работу без подключения к базе данных (например, на самолете), а затем, находясь на земле и подключенной к базе данных, быстро получить свои результаты. Kludge эффективно отрицает эту особенность.
Мне трудно поверить, что тип данных MySqlGeometry настолько ограничен, и я не вижу альтернативного типа данных. (На мой взгляд, это похоже на тип данных Decimal, который может обрабатывать только простые числа). Поэтому я обеспокоен тем, что мне не хватает того, что должно быть очевидным (это будет не в первый раз).
Любые предложения будут с благодарностью.
С Уважением,
Грег
Сборки: NetFramework версия 4.71
MySql.Data версия 8.0.13.0 (последняя версия)
Option Explicit On
Option Strict On
Public Class Form1
'
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'
'NOTES: TextBox1 IS THE WKT INPUT VALUE, Label2 IS THE WKT OUTPUT AND Label5 DISPLAYS THE SRID
'
Dim cs As String = "server=localhost;database=sakila;user id=myID;password=myPW;connectiontimeout=15"
Dim cn As New MySql.Data.MySqlClient.MySqlConnection(cs)
Dim SRID As Int32 = 4326
Dim b() As Byte = Nothing
Dim geom As MySql.Data.Types.MySqlGeometry
'
'CREATE EITHER THE 'MySqlGeometry' VALUE (SINGLE POINT) OR A Byte[] ARRAY (MULTI-POINT FIGURE) FROM THE WELL KNOWN TEXT (WKT)
'
'INPUT: FOR A SINGLE POINT GEOMETRY VALUE, CREATE THE GEOMETRY OBJECT FROM THE SPATIAL STRING (INCLUDING THE SRID)
If TextBox1.Text.ToUpper.IndexOf("POINT") = 0 Then
'
'SINGLE POINT
MySql.Data.Types.MySqlGeometry.TryParse("SRID=" & SRID & ";" & TextBox1.Text.ToUpper, geom)
'
Else
'
'MULTI-POINT FIGURE; USE GeomFromText(WKT[, SRID]) WITH A DATAREADER
'(WORKAROUND FOR THE LIMITATION OF SINGLE POINT ONLY SUPPORT OF THE MySqlGeometry DATA TYPE)
Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
Dim p As New MySql.Data.MySqlClient.MySqlParameter("@input", MySql.Data.MySqlClient.MySqlDbType.Text)
p.Direction = ParameterDirection.Input
'
'SET THE PARAMETER VALUE TO THE WELL KNOWN TEXT
p.Size = TextBox1.Text.Length
p.Value = TextBox1.Text
cmd.Parameters.Add(p)
'
'SET UP THE COMMAND TEXT
cmd.CommandText = "SELECT GeometryFromText(@input, " & SRID.ToString & ")"
cmd.Connection = cn
If cn.State <> ConnectionState.Open Then cn.Open()
cmd.CommandType = CommandType.Text
Dim myReader As MySql.Data.MySqlClient.MySqlDataReader
myReader = cmd.ExecuteReader()
'
'GET THE GEOMETRY OBJECT AS A BYTE ARRAY
While myReader.Read()
Dim s As String = myReader.GetDataTypeName(0).ToString
Dim o As Object = myReader.GetValue(0)
b = DirectCast(o, Byte())
End While
'
cn.Close()
'
End If
'
'OUTPUT
Label2.Text = Nothing
Label5.Text = Nothing
If geom.Value IsNot Nothing Then
'
'THIS IS A SINGLE POINT SPATIAL VALUE; GET THE WKT AND SRID
Label2.Text = geom.GetWKT
Label5.Text = geom.SRID.ToString
'
'THE FOLLOWING IS NOT PART OF THE DEMO SCRIPT BUT CAN BE USED FOR SINGLE POINT SPATIAL DATA RETURNED FROM A QUERY AS A Byte[] ARRAY
ElseIf b IsNot Nothing AndAlso b.Length = 25 Then
'
Dim t As MySql.Data.MySqlClient.MySqlDbType
geom = New MySql.Data.Types.MySqlGeometry(t, b)
'
'GET THE WKT AND SRID
Label2.Text = geom.GetWKT
Label5.Text = geom.SRID.ToString
'
Else
'
'MULTIPLE POINT FIGURES
Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
Dim p As New MySql.Data.MySqlClient.MySqlParameter("@input", MySql.Data.MySqlClient.MySqlDbType.Blob)
p.Direction = ParameterDirection.Input
p.Size = b.Length
p.Value = b
cmd.Parameters.Add(p)
cmd.CommandText = "SELECT ASTEXT(@input), SRID(@input)"
cmd.Connection = cn
If cn.State <> ConnectionState.Open Then cn.Open()
cmd.CommandType = CommandType.Text
Dim myReader As MySql.Data.MySqlClient.MySqlDataReader
myReader = cmd.ExecuteReader()
'
'GET THE WKT AND THE SRID
While myReader.Read()
Label2.Text = myReader.GetString(0)
Label5.Text = myReader.GetString(1)
End While
cn.Close()
'
End If
'
End Sub
'
End Class