10

ポイントAとポイントBの間の距離を計算する関数が必要です。

名前空間System.Spatialはまさに私が必要としているもののようですが、その使用方法がわかりません。

IPointLatitudeは、と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;
  }

NotImplementedExceptionそれはon で終わり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);
}

今、私はNullReferenceExceptionオンになりましたSpatialImplementation.CurrentImplementation.Operations

msdn は、これについてあまり詳細ではありません。

誰でもこれらの実装を取得する方法を説明できますか?

4

1 に答える 1

11

IMHO は使用しないでくださいSystem.Spatial。これは、OData と Spatial の相互運用性、つまり WCF Data-Services 用に作成された中途半端なライブラリです。

詳細については、こちらをご覧ください。また、そのライブラリのほとんどのクラスは抽象的であるため、ほとんどを実装するのはあなた次第です。

また、さらに悪いことに、それらは Entity Framework の空間サポートと互換性がありません。

どのようなプロジェクトに取り組んでいるかはわかりませんが、次のガイドラインを提案します。

  • ポイント間の距離を計算する必要がある場合は、C# でHaversine FormulaまたはVincenty's Formulaの実装をコピーするだけです。

  • DB で空間が必要な場合は、Entity Framework 5/6 を使用してください。

  • C# でさらに空間操作が必要な場合は、NetTopologySuite などを使用します。そのための NuGet があり、使い方は非常に簡単です。

于 2013-09-30T16:50:09.850 に答える