JSON经度纬度最近的位置

时间:2013-03-28 00:15:06

标签: jquery json

我正在创建一个脚本,我在json文件中有大约2000个城市地址,包含longitutde和latitude。

脚本必须用经度和纬度计算从提供的纬度/经度到每个条目的距离和

按最近的顺序排序。

我需要大约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 个答案:

答案 0 :(得分:1)

考虑到您提供的用于计算两个坐标之间距离的函数是正确的,您可以使用以下例程根据城市到给定位置的距离对城市进行排序:

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

Here是一个工作小提琴。

答案 1 :(得分:1)

我的解决方案只是在位置和距离之外创建一个对象数组,对它们进行排序,然后将它们吐出来。我把所有东西都保持为米而不是千米,但它很容易调整。享受!

循环时:

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/

答案 2 :(得分: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个条目。

答案 3 :(得分: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/