我需要一个函数来计算A点和B点之间的距离.
命名空间System.Spatial似乎正是我需要的,但我无法想象如何使用它.
IPoint是一个提供Latitude和Longitude两种类型的接口double.
第一次尝试 :
public static double CalculateDistance(IPoint pointA, IPoint pointB)
{
var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude);
var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude);
return gp1.Distance(gp2) ?? 0;
}
Run Code Online (Sandbox Code Playgroud)
以A结尾NotImplementedException的point1.Distance(point2).该消息是法语,但基本上它说"没有注册操作.请使用属性SpatialImplementation.CurrentImplementation.Operations提供操作".
好的,我会试试这个:
public static double CalculateDistance(IPoint pointA, IPoint pointB)
{
var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude);
var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude);
return SpatialImplementation.CurrentImplementation.Operations.Distance(gp1, gp2);
}
Run Code Online (Sandbox Code Playgroud)
现在,我得到了一个NullReferenceException上SpatialImplementation.CurrentImplementation.Operations.
Msdn对此并不是很冗长.
任何人都可以解释如何获得这些实现?
恕我直言,你不应该使用System.Spatial.这是为OData与Spatial的互操作性创建的半成品库,即WCF数据服务.
您可以在此处查看更多信息.此外,该库中的大多数类都是抽象的,因此最多可以实现它.
此外,更糟糕的是,它们与实体框架空间支持不兼容.
我不确定你在做什么样的项目,但我会建议这些指导方针:
如果你只需要计算点之间的距离,只需在C#中复制Haversine公式或Vincenty公式的实现.
如果您需要DB上的空间,请使用Entity Framework 5/6.
如果你需要在c#中进行进一步的空间操作,请使用像NetTopologySuite这样的东西.它有一个NuGet,它使用起来非常简单.