如何使用System.Spatial.GeographyPoint?

11

我需要一个函数来计算点A和点B之间的距离。

命名空间System.Spatial似乎正是我所需要的,但我不知道如何使用它。

IPoint是一个接口,提供LatitudeLongitude,均为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;
  }

point1.Distance(point2)处出现了NotImplementedException异常。错误信息为法语,但基本意思是“未注册操作,请使用属性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);
}

现在我在 SpatialImplementation.CurrentImplementation.Operations 上遇到了一个 NullReferenceException 异常。

Msdn 对此并没有过多的说明。

有人可以解释一下如何获取这些实现吗?


你是如何调用那个方法的?并且你是否已经使用一个类实现了 IPoint 接口? - Habib
当然,我已经实现了它。它只提供纬度和经度。错误就是我说的那样。目前我正在从单元测试中调用它。 - Johnny5
1个回答

12

我认为你不应该使用 System.Spatial。这是一个半成品库,专门为WCF数据服务的空间OData互操作性而创建。

你可以在 这里 获取更多信息。此外,该库中的大多数类都是抽象的,因此需要你自己实现大部分内容。

更糟糕的是,它们与Entity Framework空间支持不兼容。

我不确定你正在进行什么样的项目,但我建议遵循以下准则:

如果你只需要计算点之间的距离,只需在C#中复制Haversine FormulaVincenty's Formula的实现即可。 如果需要在数据库上进行空间操作,请使用Entity Framework 5/6。 如果需要更多的C#空间操作,请使用类似NetTopologySuite这样的工具。有一个NuGet可以使用,而且非常简单易用。

1
我现在不需要数据库支持。所有的计算都是在内存中完成的。我使用了这个答案中的算法,它似乎给出了正确的结果:https://dev59.com/-Ww15IYBdhLWcg3wisW-#6545031。话虽如此,我更喜欢一个由.NET提供的算法。 - Johnny5
1
您可以引用 Sql Server 2008/2012 类型库中包含的 SqlGeography/SqlGeometry 类型,即使不使用数据库也可以。它们在 C# 上运行得非常好。 - psousa
大多数该库中的类都是抽象类,因此大部分需要由你来实现。
  • 嗯,这完全不准确。创建实例有点困难(而且文档很糟糕)。对于除了点之外的任何内容,您都需要使用 SpatialBuilder.Create() 获取一个构建器,然后使用 GeographyPipelineGeometryPipeline
- mheyman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接