是否有贡献/核心模块来检测用户的物理位置(可能是基于IP的?)。
我最终要做的是: 1. 检测用户位置 2. 计算从用户当前位置到附加到节点的位置数据的距离(我的节点有位置数据) 3. 根据距离过滤结果(即显示选择性节点)
任何方向都会有所帮助。
我正在使用D7。
是否有贡献/核心模块来检测用户的物理位置(可能是基于IP的?)。
我最终要做的是: 1. 检测用户位置 2. 计算从用户当前位置到附加到节点的位置数据的距离(我的节点有位置数据) 3. 根据距离过滤结果(即显示选择性节点)
任何方向都会有所帮助。
我正在使用D7。
有两个模块(据我所知)为 Drupal 7 提供 IP - 位置检测:
我认为Location 模块将是您之后的下一站:
目前,它是唯一提供实现基于位置的搜索所需的视图集成的模块,旨在在用户提供的位置附近的地图上查找点。
1-您可以使用 jQuery 和这个很棒的脚本检索使用位置。
使用示例:
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()根据距离更改节点查看权限。
希望这会有所帮助……穆罕默德。
Smart IP 模块会将用户的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));
}
例如,乔治亚州亚特兰大 (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 状态码。您应该看到 200。第二个值是转换精度的近似值。如果您要根据用户与地址的距离来过滤内容,您可能需要至少 6 的准确度值。第三个和第四个值显然是纬度和经度。
您正在寻找的模块是 IP 地理定位视图https://drupal.org/project/ip_geoloc 您可能还想查看这个问题和答案:https ://drupal.stackexchange.com/questions/54873/geofield-proximity -in-views