D7 - 是否有用于检测用户位置的模块?

时间:2012-07-05 00:32:24

标签: google-maps drupal drupal-7 location drupal-modules

是否有贡献/核心模块来检测用户的物理位置(基于IP可能是?)。

我最终想做的是: 1.检测用户位置 2.计算从用户当前位置到附加到节点的位置数据的距离(我的节点有位置数据) 3.基于距离

过滤结果(即显示选择性节点)

任何方向都会有所帮助。

我正在使用D7。

4 个答案:

答案 0 :(得分:1)

有两个模块(我知道)为Drupal 7提供IP位置检测:

我认为Location module将是您之后的下一站:

  

目前,它是唯一提供实现基于位置的搜索所必需的视图集成的模块,其目的是在用户提供的位置附近的地图上查找点。

答案 1 :(得分:1)

1-您可以使用jQuery和awesome script来检索使用位置。

使用示例:

jQuery.getScript('http://www.geoplugin.net/javascript.gp', function()
{
    $('#results').html("Your location is: " + geoplugin_countryName() + ",
    " + geoplugin_region() + ", " + geoplugin_city());
});

2-您可以计算用户位置与知道每个位置纬度和经度的其他位置之间的距离。

示例:

jQuery.getScript('http://www.geoplugin.net/javascript.gp', function()
{
    var source_longitude = 30.049999;
    var source_latitude = 31.250000;
    var user_longitude = geoplugin_longitude();
    var user_latitude = geoplugin_latitude();
    var earth_radius = 6371; // in Kilo Meters

    var dLat = (source_latitude - user_latitude).toRad();
    var dLon = (source_longitude - user_longitude).toRad();

    source_latitude = source_latitude.toRad();
    user_latitude = user_latitude.toRad();

    var x = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(source_latitude ) * Math.cos(user_latitude ); 
    var y = 2 * Math.atan2(Math.sqrt(x), Math.sqrt(1 - x));

    var distance = earth_radius * y;
});

3-要过滤结果,您可以使用距离和hook_node_access()根据距离更改节点视图权限。

希望这有帮助......穆罕默德。

答案 2 :(得分:1)

Smart IP module会将用户的IP地址转换为纬度和经度坐标。以下函数将返回两对坐标之间的球面距离(英里)。

function _get_spherical_distance($s_pd, $s_ld, $f_pd, $f_ld) {
  $s_pr = deg2rad($s_pd);
  $f_pr = deg2rad($f_pd);
  $lr = deg2rad($s_ld - $f_ld);

  return 3960 * acos(sin($s_pr) * sin($f_pr) + cos($s_pr) * cos($f_pr) * cos($lr));
}

E.g。亚特兰大,乔治亚州(33.7489,-84.3879)到华盛顿州雷德蒙德(47.6739,-122.1214):

print _get_spherical_distance(33.7489, -84.3879, 47.6739, -122.1214);

输出:

  

2170.4293537864

那是2,170英里。如果您需要将地址转换为纬度和经度坐标,则可以使用Google Geocoding API

$address_string = "1600 Pennsylvania Avenue, Washington, DC 20500";
$geo_html = file_get_contents('http://maps.google.com/maps/geo?sensor=false&oe=utf8&output=csv&q='. urlencode($address_string));

print_r($geo_html);

输出:

  

200,8,38.8987149,-77.0376555

这是一个由逗号分隔的四个值的字符串。第一个是HTTP status code。你应该看到200.第二个值是转换accuracy的近似值。如果您要根据用户与地址的距离过滤内容,则可能需要至少为6的准确度值。第三和第四个值显然是纬度和经度。

答案 3 :(得分:0)

您正在寻找的模块是IP地理位置视图https://drupal.org/project/ip_geoloc 您可能还想查看此问题并回答:https://drupal.stackexchange.com/questions/54873/geofield-proximity-in-views