1

私はスクリプトを作成しています。json ファイルには、経度と緯度を含む約 2000 の都市の住所があります。

スクリプトは、経度と緯度を使用して、指定された緯度/経度から各エントリまでの距離を計算する必要があります。

近い順に並べます。

約10個の「最も近い」結果が必要です。

距離は計算できますが、最寄りの場所で並べ替えることができません。

http://jsfiddle.net/Wf6qy/

JSON ファイル:

{
    "City A": {
        "Position": {
            "Longitude": 9.96233,
            "Latitude": 49.80404
        }
    },
    "City B": {
        "Position": {
            "Longitude": 6.11499,
            "Latitude": 50.76891
        }
    },
    "City C": {
        "Position": {
            "Longitude": 6.80592,
            "Latitude": 51.53548
        }
    },
    "City D": {
        "Position": {
            "Longitude": 9.50523,
            "Latitude": 51.31991
        }
    },
    "City E": {
        "Position": {
            "Longitude": 9.66089,
            "Latitude": 48.70158
        }
    },
    "City F": {
        "Position": {
            "Longitude": 9.93368,
            "Latitude": 53.55608
        }
    },
    "City G": {
        "Position": {
            "Longitude": 11.56122,
            "Latitude": 48.14496
        }
    },
    "City H": {
        "Position": {
            "Longitude": 13.34253,
            "Latitude": 52.5319
        }
    },
    "City I": {
        "Position": {
            "Longitude": 6.11327,
            "Latitude": 50.77715
        }
    },
    "City J": {
        "Position": {
            "Longitude": 13.36671,
            "Latitude": 52.54344
        }
    }
}

jQuery :

var jsonString =
    '{"City A":{"Position":{"Longitude":9.96233,"Latitude":49.80404}},"City B":{"Position":{"Longitude":6.11499,"Latitude":50.76891}},"City C":{"Position":{"Longitude":6.80592,"Latitude":51.53548}},"City D":{"Position":{"Longitude":9.50523,"Latitude":51.31991}},"City E":{"Position":{"Longitude":9.66089,"Latitude":48.70158}},"City F":{"Position":{"Longitude":9.93368,"Latitude":53.55608}},"City G":{"Position":{"Longitude":11.56122,"Latitude":48.14496}},"City H":{"Position":{"Longitude":13.34253,"Latitude":52.5319}},"City I":{"Position":{"Longitude":6.11327,"Latitude":50.77715}},"City J":{"Position":{"Longitude":13.36671,"Latitude":52.54344}}}';

var myData = JSON.parse(jsonString);

$(document).ready(function () {

    $.each(myData, function (a, b) {

        //$("#groups").append("<li>"+b.Position.Longitude+"</li>");

        $("#groups").append('<li><h2>' + a + '</h2><p>' + hesapla(9.9608999, 49.7222842, b.Position.Longitude, b.Position.Latitude) + '</p></a></li>');

    });




    function hesapla(meineLongitude, meineLatitude, long1, lat1) {
        erdRadius = 6371;

        meineLongitude = meineLongitude * (Math.PI / 180);
        meineLatitude = meineLatitude * (Math.PI / 180);
        long1 = long1 * (Math.PI / 180);
        lat1 = lat1 * (Math.PI / 180);

        x0 = meineLongitude * erdRadius * Math.cos(meineLatitude);
        y0 = meineLatitude * erdRadius;

        x1 = long1 * erdRadius * Math.cos(lat1);
        y1 = lat1 * erdRadius;

        dx = x0 - x1;
        dy = y0 - y1;

        d = Math.sqrt((dx * dx) + (dy * dy));

        if (d < 1) {
            return Math.round(d * 1000) +" m"
            ;
        } else {
            return Math.round(d * 10) / 10 +" km"
            ;
        }
    };



});
4

4 に答える 4

2

私のソリューションは、位置と距離からオブジェクトの配列を作成し、並べ替えてから吐き出すだけです。すべてをキロメートルではなくメートルにしましたが、微調整は簡単です。楽しみ!

ループ中:

distanceObj[i] = {
    distance: hesapla(9.9608999, 49.7222842, b.Position.Longitude, b.Position.Latitude),
    location: a
};
++i;

次に並べ替えます。

distanceObj.sort(function(a,b) {
    return parseInt(a.distance) - parseInt(b.distance)
});

これはよりよく説明します: http://jsfiddle.net/mitchmalone/Wf6qy/1/

于 2013-03-28T01:12:42.593 に答える
1

2 つの座標間の距離を計算するために提供した関数が正しいことを考慮して、次のルーチンを使用して、特定の場所までの距離に従って都市を並べ替えることができます。

// user supplied lat/long
var origin = JSON.parse('{"Longitude":9.96233,"Latitude":49.80404}');

// cities to sort
var cities = JSON.parse('{"City A":{"Position":{"Longitude":9.96233,"Latitude":49.80404}},"City B":{"Position":{"Longitude":6.11499,"Latitude":50.76891}},"City C":{"Position":{"Longitude":6.80592,"Latitude":51.53548}},"City D":{"Position":{"Longitude":9.50523,"Latitude":51.31991}},"City E":{"Position":{"Longitude":9.66089,"Latitude":48.70158}},"City F":{"Position":{"Longitude":9.93368,"Latitude":53.55608}},"City G":{"Position":{"Longitude":11.56122,"Latitude":48.14496}},"City H":{"Position":{"Longitude":13.34253,"Latitude":52.5319}},"City I":{"Position":{"Longitude":6.11327,"Latitude":50.77715}},"City J":{"Position":{"Longitude":13.36671,"Latitude":52.54344}}}');

// loop through each city and calculate its distance
var array = [];
for (var name in cities) {
    var city = cities[name];
    array.push({
        cityName: name,
        distance: calculateDistance(origin, city.Position)
    });
}

// this is the function you provided (slightly modified)
function calculateDistance(p1, p2) {
    var erdRadius = 6371;

    p1.Longitude = p1.Longitude * (Math.PI / 180);
    p1.Latitude = p1.Latitude * (Math.PI / 180);
    p2.Longitude = p2.Longitude * (Math.PI / 180);
    p2.Latitude = p2.Latitude * (Math.PI / 180);

    var x0 = p1.Longitude * erdRadius * Math.cos(p1.Latitude);
    var y0 = p1.Latitude * erdRadius;

    var x1 = p2.Longitude * erdRadius * Math.cos(p2.Latitude);
    var y1 = p2.Latitude * erdRadius;

    var dx = x0 - x1;
    var dy = y0 - y1;

    return Math.sqrt((dx * dx) + (dy * dy));
}

// finaly, sort the cities according to their distance
array.sort(function (a, b) {
    return a.distance - b.distance;
});

これが実用的なフィドルです。

于 2013-03-28T01:03:12.987 に答える
0

代わりに、オブジェクトをリストにする必要があります。入力を変更するのではなく、その場で変換できます。

距離の計算を文字列に変換するのではなく、実数として保持することも重要です。

function schoneStrecke(d){
    if (d < 1) {
        return Math.round(d * 1000) +" m";
    } else {
        return Math.round(d * 10) / 10 +" km";
    }
};

そして、出力を作成するときにのみ呼び出します。

$("#groups").append('<li><h2>' + myList[i].name + '</h2><p>' + schoneStrecke(myList[i].distance) + '</p></a></li>');

これが私のフィドルです:http://jsfiddle.net/krets/7f8pY/2/

于 2013-03-28T01:41:00.940 に答える
0

次のような JSON 構造をお勧めします。

[
  {
    "City": "City A",
    "Position": {
        "Longitude": 9.96233,
        "Latitude": 49.80404
    }
  },
  {
    "City": "City B",
    "Position": {
        "Longitude": 6.11499,
        "Latitude": 50.76891
      }
   }
]

各都市はすべて配列内に保持されるオブジェクトです。これにより、よりアクセスしやすく、使いやすくなります。

$.each()次に、ループを次のものに置き換えます。

$.each(myData, function (a, b)
{
    b.Distance = hesapla(9.9608999, 49.7222842, b.Position.Longitude, b.Position.Latitude);
});

myData.sort(function(a, b)
{
    var distanceA = parseFloat(a.Distance);
    var distanceB = parseFloat(b.Distance);

    if(distanceA > distanceB)
    {
        return 1;
    }
    else if(distanceA < distanceB)
    {
        return -1;
    }
    return 0;
});

for(var i = 0, iMax = 10; i < iMax; i++)
{
    $("#groups").append('<li><h2>' + myData[i].City + '</h2><p>' + myData[i].Distance + '</p></a></li>');
}

これにより、それぞれの距離が計算され、都市のオブジェクトに格納され、距離で並べ替えられ、最初の 10 エントリが出力されます。

于 2013-03-28T00:58:34.207 に答える