10

緯度/経度座標のセット間の距離を決定するものを書き込もうとしています。

このサイトで見つけた次のコードを使用しています。

public static double distance (double lat1, double lon1, double lat2, double lon2) { 
    double lat1 = Convert.ToDouble(latitude);
    double lon1 = Convert.ToDouble(longitude);
    double lat2 = Convert.ToDouble(destlat);
    double lon2 = Convert.ToDouble(destlon);

    double theta = toRadians(lon1-lon2); 
    lat1 = toRadians(lat1); 
    lon1 = toRadians(lon1); 
    lat2 = toRadians(lat2); 
    lon2 = toRadians(lon2); 

    double dist = sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(theta); 
    dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

    return dist; 
} 

私の問題は、「'toRadians'/'cos'/'sin/'toDegrees' という名前は現在のコンテキストには存在しません...」というコンパイル エラーが発生することです。

4

6 に答える 6

26

次の C# クラスを使用することができます。

public static class GeoCodeCalc
{
    public const double EarthRadiusInMiles = 3956.0;
    public const double EarthRadiusInKilometers = 6367.0;

    public static double ToRadian(double val) { return val * (Math.PI / 180); }
    public static double DiffRadian(double val1, double val2) { return ToRadian(val2) - ToRadian(val1); }

    public static double CalcDistance(double lat1, double lng1, double lat2, double lng2) 
    {
        return CalcDistance(lat1, lng1, lat2, lng2, GeoCodeCalcMeasurement.Miles);
    }

    public static double CalcDistance(double lat1, double lng1, double lat2, double lng2, GeoCodeCalcMeasurement m) 
    {
        double radius = GeoCodeCalc.EarthRadiusInMiles;

        if (m == GeoCodeCalcMeasurement.Kilometers) { radius = GeoCodeCalc.EarthRadiusInKilometers; }
        return radius * 2 * Math.Asin( Math.Min(1, Math.Sqrt( ( Math.Pow(Math.Sin((DiffRadian(lat1, lat2)) / 2.0), 2.0) + Math.Cos(ToRadian(lat1)) * Math.Cos(ToRadian(lat2)) * Math.Pow(Math.Sin((DiffRadian(lng1, lng2)) / 2.0), 2.0) ) ) ) );
    }
}

public enum GeoCodeCalcMeasurement : int
{
    Miles = 0,
    Kilometers = 1
}

使用法:

// Calculate Distance in Miles
GeoCodeCalc.CalcDistance(47.8131545175277, -122.783203125, 42.0982224111897, -87.890625);

// Calculate Distance in Kilometers
GeoCodeCalc.CalcDistance(47.8131545175277, -122.783203125, 42.0982224111897, -87.890625, GeoCodeCalcMeasurement.Kilometers);

出典: Chris Pietschmann - C# と JavaScript でジオコード間の距離を計算する

于 2010-01-06T01:53:16.917 に答える
5

toRadians次のような関数を書くことができます:

double ToRadians(double degrees) { return degrees * Math.PI / 180; }

toDegrees次のような関数を書くことができます:

double ToDegrees(double radians) { return radians * 180 / Math.PI; }

sincosMath.Sinとに置き換える必要がありMath.Cosます。

于 2010-01-06T01:47:51.330 に答える
2

これはC#のようです。

まず、 と を定義する必要がありtoRadiansますtoDegrees

double toRadians(double degrees) {
    double sign = Math.Sign(degrees);
    while(Math.Abs(degrees) > 360) {
        degrees -= sign * 360;
    }
    return Math.PI * degrees / 180;
}

double toDegrees(double radians) {
    double sign = Math.Sign(radians);
    while(Math.Abs(radians) > 2 * Math.PI) {
        radians -= sign * 2 * Math.PI;
    }
    return 180 * radians / Math.PI;
}

次に、三角関数を使用するにはMath.SinMath.Cos、 などを使用する必要があります。

double dist = Math.Sin(lat1) * Math.Sin(lat2)
                + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);

dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

コメント:

public static double distance (double lat1, double lon1, double lat2, double lon2) { 
double lat1 = Convert.ToDouble(latitude);
double lon1 = Convert.ToDouble(longitude);
double lat2 = Convert.ToDouble(destlat);
double lon2 = Convert.ToDouble(destlon);

これは何ですか?latitudelongitudedestlatおよびはどこでdestlon定義されていますか? さらに、このメソッドのパラメーターとしてとがあるようlat1に見えるため、ここで同じ名前のローカルを定義することはできません。lon1 lat2lon2

double theta = toRadians(lon1-lon2); 
lat1 = toRadians(lat1); 
lon1 = toRadians(lon1); 
lat2 = toRadians(lat2); 
lon2 = toRadians(lon2); 

これはスタイルが悪い。が緯度を度で表している場合は、次のようlat1にラジアンに相当する値を計算する方がはるかに優れています。lat1

double lat1Radians = toRadians(lat1);

したがって、上記を次のように置き換えます。

double theta = toRadians(lon1-lon2); 
double lat1Radians = toRadians(lat1); 
double lon1Radians = toRadians(lon1); 
double lat2Radians = toRadians(lat2); 
double lon2Radians = toRadians(lon2);

最後に:

double dist = sin(lat1) * sin(lat2)
                + cos(lat1) * cos(lat2) * cos(theta); 
dist = toDegrees(acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

これもスタイル悪い。最初の式と 2 番目の式の両方が、計算しようとしている距離を表すことはできません。最初の式の結果を、より意味のある名前の変数に割り当てる必要があります。最悪の場合、少なくとも次のことを行います。

double temp = Math.Sin(lat1) * Math.Sin(lat2)
                + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(theta);
double dist = toDegrees(Math.Acos(dist)) * 60 * 1.1515 * 1.609344 * 1000; 

return dist;
于 2010-01-06T01:49:51.543 に答える
2

私はこの質問が本当に古いことを知っていますが、他の誰かがこれに出くわした場合は、GeoCoordinatefromを使用してSystem.Deviceください:

var distanceInMeters = new GeoCoordinate(lat1, lon1)
    .GetDistanceTo(new GeoCoordinate(lat2, lon2));
于 2014-12-18T11:51:58.400 に答える
1

緯度点と経度点の間の距離を計算しています...

double Lat1 = Convert.ToDouble(緯度);

    double Long1 = Convert.ToDouble(longitude);

    double Lat2 = 30.678;
    double Long2 = 45.786;
    double circumference = 40000.0; // Earth's circumference at the equator in km
    double distance = 0.0;
    double latitude1Rad = DegreesToRadians(Lat1);
    double latititude2Rad = DegreesToRadians(Lat2);
    double longitude1Rad = DegreesToRadians(Long1);
    double longitude2Rad = DegreesToRadians(Long2);
    double logitudeDiff = Math.Abs(longitude1Rad - longitude2Rad);
    if (logitudeDiff > Math.PI)
    {
        logitudeDiff = 2.0 * Math.PI - logitudeDiff;
    }
    double angleCalculation =
        Math.Acos(
          Math.Sin(latititude2Rad) * Math.Sin(latitude1Rad) +
          Math.Cos(latititude2Rad) * Math.Cos(latitude1Rad) * Math.Cos(logitudeDiff));
    distance = circumference * angleCalculation / (2.0 * Math.PI);
    return distance;
于 2016-03-17T08:00:45.113 に答える
0

このコードを少し変更する必要があります。

toRadians()SLaks が言うように、 .NET にはネイティブ バージョンがないため、独自のメソッドを定義する必要があります。

また、cos() と sin() の呼び出しを次のように変更する必要があります: Math.Cos() と Math.Sin()

于 2010-01-06T01:51:37.403 に答える