web-dev-qa-db-fra.com

Construire un point DbGeography à partir de doubles latitude et longitude?

Je veux construire un point DbGeography à partir de doubles latitude et longitude.

Je sais que je peux convertir mes doubles en chaînes et utiliser la méthode 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);

Mais il semble inutile de convertir mes doubles en chaînes afin que DbGeography puisse les analyser à nouveau en double.


J'ai essayé de construire une DbGeography directement comme ceci:

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

mais les propriétés Latitude et Longitude sont en lecture seule. (Ce qui est logique, car la classe DbGeography traite beaucoup plus que des points individuels)


La classe DbGeography fournit également une méthode FromBinary qui utilise un tableau d'octets. Je ne suis pas sûr de savoir comment martialiser ma latitude et ma longitude dans un tableau d'octets correctement formaté.

Existe-t-il un moyen plus simple de construire une instance DbGeography à partir de doubles Latitude et Longitude que le code au sommet?

35
jcarpenter2

En bref, non il n'y en a pas.

SqlGeography a une méthode appropriée:

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

... mais vous devrez alors convertir à DbGeography quand même. Si cela vous intéresse, voyez une de mes réponses précédentes sur la conversion: DbGeography to SqlGeography (et retour)

Cela dit, je suis tout à fait d’accord avec Raphael Althaus dans le sens où vous devriez créer une méthode statique pour vous simplifier la vie:

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);
}

Ensuite, toute utilisation peut passer par cette méthode.

MODIFIER

@ Kororem a fait une excellente suggestion que je l'ai fait moi-même depuis que je répondais à la question. La plupart des gens utilisent le SRID 4326 afin que nous puissions rendre la méthode statique plus facile à utiliser en la prenant comme valeur par défaut du paramètre.

49
Jon Bellamy

Vous pouvez le simplifier comme ceci:

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

par exemple:

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

sans utiliser int srid = 4326; qui est la valeur par défaut.

Si vous l'utilisez plusieurs fois, utilisez-le dans une méthode statique:

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

PS: N'oubliez pas d'utiliser CultureInfo.InvariantCulture car vous obtiendrez une exception pour certaines cultures.

0
Dan