1

我获取车辆的 GPS 点以建立其轨迹。

我用 C# 开发并使用 SqlGeography 类型(LineString)。我使用地理类型将其存储到 SQL Server 数据库中。

每个接收到的 GPS 点都使用 AddLine 方法添加,如下所示:

private SqlGeography AddPoint(SqlGeography existingLine, SqlGeography pointToAdd)
{
    SqlGeographyBuilder line = new SqlGeographyBuilder();
    line.SetSrid(4326);
    line.BeginGeography(OpenGisGeographyType.LineString);

    line.BeginFigure(existingLine.STStartPoint().Lat.Value, existingLine.STStartPoint().Long.Value);
    for (int i = 2; i <= existingLine.STNumPoints().Value; i++)
    {
        line.AddLine(existingLine.STPointN(i).Lat.Value, existingLine.STPointN(i).Long.Value);
    }

    // Add a new point.
    line.AddLine(pointToAdd.Lat.Value, pointToAdd.Long.Value);

    line.EndFigure();
    line.EndGeography();

    return line.ConstructedGeography;
}

当大量 GPS 点(大约 825000 点)发生内存不足异常时,我感到很惊讶。这发生在行代码上:

return line.ConstructedGeography;

我已将 SqlGeography 类型更改为 SqlGeometry 类型,结果是立即的,无一例外。

此外,我的跟踪有时无效,我必须使用 MakeValid 方法。当跟踪的 GPS 数据量增加时,执行此方法需要大量时间。

问题:

1)是否有另一种方法可以在现有跟踪中添加一个点?我们是否被迫在现有线的点上循环以便在添加新点之前使用 SqlGeographyBuilder 重建它?

2) 为什么使用 SqlGeometry 类型的结果是立即的,没有例外?原因是什么?与 ConstructedGeometry 方法相比,如何使用 ConstructedGeography 方法?如果找到,我想得到一个带有最终链接的简短解释?我在几个主题上看到 SqlGeometry 的限制比 SqlGeography 类型少,但相关的约束是什么?

3)在我的情况下,我应该注意什么来避免使用 MakeValid 方法来构建有效的线串?我认为与具有环形方向的多边形相比。

4) 为什么使用 SqlGeographyBuilder 的 AddLine 方法合并 3 个有效的线串会给我一个无效的线串?如果我使用 MakeValid 方法,我将获得一个包含 130772 个点的对象,而 3 个线串中的每一个都包含 1000 个点。为什么我没有得到一个 3000 分的对象?为什么尺寸会增加?

4

0 回答 0