Pregunta

I can use the following SQL to calculate the distance between a fixed location and the location against the venues in the database.

SELECT Location.STDistance(geography::Point(51, -2, 4326)) * 0.00062137119 FROM Venues

Please note the distance returned is in miles and the Location field is a geography type.

I was wondering what is the equivalent of this in .NET which would return the same values. This method would have the following signature:

public static double Distance(location1Latitude, location1Longitude, location2Latitude, location2Longitude) {
    return ...;
}

I know I could call the database method in .NET but I don't wish to do this. I'm hoping there is a formula to calculate the distance. Thanks

¿Fue útil?

Solución 2

You would need to compute the Geographical distance to compute the distance manually. There are many different techniques and formulas to do this, each with different underlying assumptions (ie: a spherical earth, ellipsoidal earth, etc).

A common option is the haversine formula, with a C# implementation available here.

Otros consejos

I believe you can simply add Microsoft.SqlServer.Types.dll as a reference and then use the SqlGeometry type like any other .NET type, including calling the STDistance method.

this is very well explained here. Shortly: with EF5 (to be more specific, with .net 4.5) Microsoft included the type DbGeography. Let say you already have a bunch of lat/long, you can then create a DbGeography object easily using an helper like:

public static DbGeography CreatePoint(double latitude, double longitude)
{
    var text = string.Format(CultureInfo.InvariantCulture.NumberFormat,
                             "POINT({0} {1})", longitude, latitude);
    // 4326 is most common coordinate system used by GPS/Maps
    return DbGeography.PointFromText(text, 4326);
}

Once you got a two or more points (DbGeography) you got everything to calculate the Distance between them:

var distance = point1.Distance(point2)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top