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