web-dev-qa-db-ja.com

緯度と経度の倍からDbGeographyポイントを構築しますか?

緯度と経度の倍精度からDbGeographyポイントを構築したい。

ダブルを文字列に変換し、DbGeography.FromText 方法。

var latitude = 50.0d;
var longitude = 30.0d;

var pointString = string.Format(
    "POINT({0} {1})",
    longitude.ToString(),
    latitude.ToString());

var point = DbGeography.FromText(pointString);

しかし、DbGeographyが再びdoubleとして解析できるように、doubleを文字列に変換するのは無駄だと思われます。


このように直接DbGeographyを構築してみました:

var point = new DbGeography()
{
    Latitude = 50,
    Longitude = 30
};

ただし、LatitudeおよびLongitudeプロパティは読み取り専用です。 (DbGeographyクラスは個々のポイントよりもはるかに多くを処理するため、これは理にかなっています)


DbGeographyクラスは、バイト配列を受け取るFromBinaryメソッドも提供します。緯度と経度を正しくフォーマットされたバイト配列に二重化する方法がわかりません。

最上位のコードよりもLatitudeおよびLongitude doublesからDbGeographyインスタンスを構築する簡単な方法はありますか?

37
jcarpenter2

要するに、ありません。

SqlGeographyには適切なメソッドがあります。

Microsoft.SqlServer.Types.SqlGeography.Point(latitude, longitude, srid);

...しかし、とにかくDbGeographyに変換する必要があります。これに興味がある場合は、変換に関する私の以前の答えを参照してください: DbGeography to SqlGeography(およびback)

とはいえ、Raphael Althausには完全に同意します。あなたの生活を楽にする静的メソッドを作成する必要があるという点です。

public static DbGeography CreatePoint(double lat, double lon, int srid = 4326)
{
    string wkt = String.Format("POINT({0} {1})", lon, lat);

    return DbGeography.PointFromText(wkt, srid);
}

その後、すべての使用法がそのメソッドを通過できます。

[〜#〜] edit [〜#〜]

@Korayem質問に最初に答えてから実際に自分でやったという素晴らしい提案をしました。ほとんどの人がSRID 4326を使用するため、静的メソッドをパラメーターのデフォルト値として使用することで、静的メソッドをより使いやすくすることができます。

50
Jon Bellamy

次のように簡略化できます。

  DbGeography.FromText(String.Format(CultureInfo.InvariantCulture, "POINT({0} {1})", longitude, latitude));

例えば:

DbGeography.FromText("POINT(-73.935242 40.730610)"),

int srid = 4326を使用しない場合;これがデフォルト値です。

何回も使用する場合は、静的メソッドで使用します。

private static DbGeography CreatePoint(double latitude, double longitude)
{
    return DbGeography.FromText(String.Format(CultureInfo.InvariantCulture, "POINT({0} {1})", longitude, latitude));
}

PS:CultureInfo.InvariantCultureの使用を忘れないでください。一部の文化では例外が発生します。

0
Dan