Haversine公式,PHP,如果有条件,请添加到第二个表中

问题描述 投票:0回答:1

我正在尝试实现Haversine Formula来检查表格的经度/纬度。我的Android应用程序将所有传入位置存储在数据库的特定表inregistrari中。我的目标是获取公式以根据经度和纬度测试新的传入位置,如果新值与alerte(第二张表)中存在的值之间的距离大于50m,则将insert个位置进入两个表(alerteinregistrari),否则,仅进入inregistrari。必须使用alerte中存储的所有位置来验证新值。因此,最后我将得到一张包含所有位置(inregistrari)的表,而第二张表仅包含在50m(alerte)内没有其他位置的位置的表。我尝试实现( 6371 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ),但无法使其以我想要的方式工作。由于PHP,我正在寻求指导,但实际上我对此还不是很熟悉。作为第一步,我设法在两个表中直接自动创建了PHP,现在只需要实现insert。预先感谢!

php尝试实现Haversine:

Haversine

我已经尝试实现case 'alerta': if(isTheseParametersAvailable(array('latitudine', 'longitudine', 'id_alerta_tip', 'ID_user'))){ $problema = $_POST['id_alerta_tip']; $latitudine = $_POST['latitudine']; $longitudine = $_POST['longitudine']; $id = $_POST['ID_user']; $stmt = $conn->prepare("SELECT latitudine, longitudine FROM inregistrari WHERE latitudine = ? AND longitudine = ?"); $stmt->bind_param("ss", $latitudine, $longitudine); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows < 1){ $stmt = $conn->prepare("INSERT INTO inregistrari (ID_user, id_alerta_tip, latitudine, longitudine) VALUES (?, ?, ?, ?)"); $stmt->bind_param("ssss", $id, $problema, $latitudine, $longitudine); $stmt->execute(); $stmt->store_result(); $stmt = $conn->prepare("SELECT * FROM alerte WHERE id_alerta_tip = ?"); $stmt->bind_param("s",$problema); $stmt->execute(); $stmt->store_result(); while($row = mysqli_fetch_array($stmt)) { $latitudine1=$row[latitudine]; $longitudine1=$row[longitudine]; function getDistance($latitude1, $longitude1, $latitude2, $longitude2) { $earth_radius = 6371; $dLat = deg2rad($latitude2 - $latitude1); $dLon = deg2rad($longitude2 - $longitude1); $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2); $c = 2 * asin(sqrt($a)); $d = $earth_radius * $c; return $d; } if(getDistance($latitudine,$longitudine,$latitudine1,$longitudine1)<0.05) { $stmt = $conn->prepare("INSERT INTO alerte(id_utilizator, latitudine, longitudine, tip_problema) VALUES ('$id','$latitudine', '$longitudine', '$problema')"); $stmt->execute(); } } $stmt = $conn->prepare("SELECT id_alerta FROM alerte WHERE latitudine = ? AND longitudine = ?"); $stmt->bind_param("ss", $latitudine, $longitudine); $stmt->execute(); $stmt->store_result(); if($stmt->num_rows > 0){ $stmt->bind_result($id_alerta); $stmt->fetch(); $stmt= $conn->prepare("UPDATE inregistrari SET ID_Alerta_Primarie = ? WHERE latitudine = ? AND longitudine = ?"); $stmt->bind_param("iss",$id_alerta ,$latitudine, $longitudine); $stmt->execute(); $stmt->close(); }else{ $response['error'] = false; $response['message'] = 'Alerta nu a putut fi inregistrata'; } $response['error'] = false; $response['message'] = 'Alerta raportata'; }else{ $response['error'] = false; $response['message'] = 'Alerta nu a putut fi inregistrata'; } }else{ $response['error'] = false; $response['message'] = 'Alerta nu a putut fi inregistrata'; } break; 以一次获取每一行,但是它不起作用。该代码在while语句之前停止运行。谢谢!

php android haversine
1个回答
0
投票

这是实际的Haversine公式:

while

这是MySQL的等效项:

R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
Angles need to be in radians to pass to Trigonometric functions

我在这里检查20英里以内的任何区域,但是您可以根据需要将其设置为短或长。查询开始处的3959数字是用于英里的数字,如果您使用公里,则应将此数字更改为6371。我将其限制为1行,因为我只想要最接近的匹配项,但是您可能想要在其他情况下更改此设置!

这是Haversine SELECT *, ( 3959 * acos( cos( radians(55.864237) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-4.251806) ) + sin( radians(55.864237) ) * sin( radians( latitude ) ) ) ) AS distance FROM postcodes HAVING distance < 20 ORDER BY distance LIMIT 1; 的Wiki >>

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.