我有纬度和经度,我想从数据库中提取记录,该记录具有最近的纬度和经度,如果该距离长于指定的距离,则不检索它.
表结构:
id
latitude
longitude
place name
city
country
state
zip
sealevel
Run Code Online (Sandbox Code Playgroud) 我想要做的是我在数据库中有条目存储lat/long.我想计算用户lat/long和条目lat/long(在DB中)之间的距离.在那之后,我想回应距离小于500米的那些.到目前为止,我能够使用它foreach.
<?php
mysql_connect("localhost", "beepbee_kunwarh", "kunwar") or die('MySQL Error.');
mysql_select_db("beepbee_demotest") or die('MySQL Error.');
$Lat = $_REQUEST['Lat'];
$long = $_REQUEST['long'];
$query = mysql_query("SELECT a.*, 3956 * 2 * ASIN(SQRT( POWER(SIN(($Lat - Lat) * pi()/180 / 2), 2) + COS($Lat * pi()/180) * COS(Lat * pi()/180) *POWER(SIN(($long - long) * pi()/180 / 2), 2) )) as distance FROM userResponse GROUP BY beepid HAVING distance <= 500 ORDER by distance ASC;");
$data = array();
while ($row = mysql_fetch_array($query)) {
$data[] = $row; …Run Code Online (Sandbox Code Playgroud) 我维护一个包含大量可下载文件的站点.它目前托管在美国的服务器上,但我最近在德国购买了一台新服务器.我想将下载镜像到德国的服务器,并在第一台服务器(托管网站)上有一个PHP脚本,根据用户的位置检测要使用的文件镜像.例如,如果用户在加拿大,他们应该从我在美国的当前服务器下载文件.如果他们在法国,他们应该从德国获取文件,而不是从大西洋下载.那么,我如何确定他们离哪个国家更近?
我知道MaxMind GeoIP,并安装了它,但这只是给了我一个国家,而AFAIK,没有办法自动确定我的两个镜像国家中哪个国家最接近.我想我能做的就是走大陆:让亚洲,欧洲,非洲和澳大利亚的用户从德国获取内容,来自北美和南美的访问者从美国获取文件如果有人能想到更好的解决方案,我愿意接受建议.
好吧,我想我会按照我原来的大陆检查想法去做.对于其他想要做这种事情的人来说,这将是一个很好的起点.当我在欧洲有多个镜子时,问题就出现了,但是大陆的想法现在必须起作用.
这是我的代码:
<?php
$lat1 = 35.697959;
$lat2 = 35.697959;
$lon1 = 139.707085;
$lon2 = 139.707085;
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
var_dump($dist); // returns 1
$dist = acos($dist);
var_dump($dist); // returns NAN
Run Code Online (Sandbox Code Playgroud)
正如您从注释中看到的,$dist等于1在计算之后,但是在我应用acos()时返回NAN。
如果我尝试手动复制它,则效果很好:
$x = 1;
$x = acos($x);
var_dump($x); // returns 0 as expected
Run Code Online (Sandbox Code Playgroud)
这是怎么回事,我该如何解决?
php ×4
math ×2
coordinates ×1
distance ×1
geolocation ×1
geometry ×1
ip-address ×1
mirroring ×1
mysql ×1
nan ×1
proximity ×1
sql ×1
trigonometry ×1