将纬度经度转换为SQL-Server地理

时间:2014-08-15 09:36:29

标签: sql-server delphi delphi-xe5

我将坐标作为两个双倍值,纬度和经度。我需要以某种方式将它们转换为SQL-Server Geography数据类型。

我在C#中有一个实际的例子,但我不知道如何在Delphi中做到这一点。 目的是检索在我的示例中访问SqlGeographyBinary时获得的相同数据,以将其保存在文本文件中。

public Double Latitude { get; set; }

public Double Longitude { get; set; }

private String sqlGeographyBinary = null;
public String SqlGeographyBinary
{
    get
    {
        if (String.IsNullOrWhiteSpace(sqlGeographyBinary))
        {
            using (var stream = new MemoryStream())
            {
                using (var writer = new BinaryWriter(stream))
                {
                    var sqlPoint = SqlGeography.Point(Latitude, Longitude, SRID);
                    sqlPoint.Write(writer);
                    stream.Position = 0;
                    var buffer = new Byte[stream.Length];
                    stream.Read(buffer, 0, (int)stream.Length);
                    sqlGeographyBinary = BitConverter.ToString(buffer).Replace("-", "");
                    writer.Close();
                }
           }
        }        
        return sqlGeographyBinary;
    }
}

1 个答案:

答案 0 :(得分:1)

SqlGeography类型是Delphi本身不支持的.NET类型,因此没有直接的方法可以执行您想要的操作而无需将C#函数导出到DLL或让MSSQL服务器执行此操作为你生成类型。

对于后者,作为一种解决方案,这是完全未经测试的,因为我没有数据库可以尝试这一点,但是从the documentation来看,听起来SQL Server可以为您构建和解释类型。即:

insert into MyTable (geographyCol) values (someParam)

您可以将参数定义为TDBXDataTypes.AnsiStringType,如:

someParam --> 'SqlGeography.Point(Latitude, Longitude, SRID)'

同样,阅读该领域:

Select geographyCol.ToString() from MyTable

将返回SqlGeograhpy实例的Open Geospatial Consortium (OGC) Well-Known Text (WKT)表示。我猜,你也可以以类似的方式归还任何其他财产。