按特定半径内的邮政编码和过滤列表搜索?

时间:2015-04-22 08:25:05

标签: c# sql asp.net-mvc linq

我试图想出一种方法来接受以下用户输入:

  • 邮政编码
  • 距离(例如:1,5,10)[英里]

查询包含以下内容的List:

  • 位置名称
  • 邮政编码
  • 纬度
  • 经度

过滤后的列表应仅返回输入的邮政编码&的(x)英里半径范围内的位置。计算每个距离(例如:1.2英里,0.5英里等)。有什么建议?

提前致谢!

2 个答案:

答案 0 :(得分:1)

我们使用Google Geocoding API将ZipCode转换为客户端的纬度和经度。在AJAX请求中,我们将lat,long和distance发布到服务器代码。服务器使用纬度/经度和半径计算偏移量,从纬度和经度计算,然后搜索匹配的记录。

if (!ValidaZipCode(zipCode)) {
    $("#searchZiperror").show();
    $(".driverZipcode").removeClass("wouterror");
    $(".driverZipcode").addClass("driverZipcodeError");
    return false;
}
else {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': zipCode }, function (results, status) {
 if (status == google.maps.GeocoderStatus.OK) {
     var currentlatlng = results[0].geometry.location;
     if (currentlatlng) {
         var lat = currentlatlng.lat();
         var lng = currentlatlng.lng();

         var model = {
             address: zipCode,
             latitude: lat,
             longitude: lng,
             radius: radiusValue
         };

         $.ajax({
                 url: '@Url.Action("UpdateRadius", "MyController")',
                 contentType: 'application/json; charset=utf-8',
                 type: 'POST',
                 dataType: 'html',
                 data: JSON.stringify(model)
             })
             .success(function (result) {
                 // Use the result for appropriate action
             })
             .error(function (xhr, status) {
                 // Use the status for appropriate action
             });
     }
 }

答案 1 :(得分:0)

从理论的角度来看,你可以做到,并且有很多公式可以进行距离计算(这里有一些资源:http://www.movable-type.co.uk/scripts/latlong.html)。

但请注意,随着列表的增加,这会变得越来越昂贵,因为您必须对列表中的每个元素使用此类公式。

通常,要以有效的方式执行此类操作(以及许多其他操作),它使用的是GIS系统(http://en.wikipedia.org/wiki/Geographic_information_system,有些是开源的或免费的,如PostgreSQL带有插件,如果我这不是错的),这是专门从事这一领域的。