构建包含大量GPS数据的GPS轨迹时出现内存不足

时间:2017-09-22 09:48:19

标签: c# gps sqlgeography sqlgeometry

我获得车辆的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分的对象?为什么尺寸会增加?

0 个答案:

没有答案