0

解決するのに何時間も費やした質問があります。de Haversine 式を使用して 2 点間の距離を計算していますが、使用しているコードでは、KM のような距離には高すぎる値が返されます。

これはコードです:

$pesquisa_raio = "%" . $_GET['raio'] . "%";
$latitude = floatval("%" . $_GET['lat'] . "%");
$longitude = floatval("%" . $_GET['log'] . "%");
$cidade="%" . $_GET['cidade'] . "%";

$sql= "SELECT * FROM oferta";//"add depois" //Inner Join concelhos On oferta.concelhos_id = concelhos.idconcelhos ";
$query = mysql_query($sql);
$array = mysql_fetch_array($query);
$row = mysql_num_rows($query);
//$sql_cidades = "SELECT * FROM oferta WHERE localizacao like '$pesquisa_loc'";


if (isset($latitude) && isset($longitude)) {
    if ($row > 0) {
        do {
        $endereco=$array['concelho_id'];
        $request="http://maps.google.com/maps/api/geocode/json?address='.$endereco.'sensor=false";
        $json_data=file_get_contents($request);
        
        $earth_radius = 6372.795477598;
        $lat_1 = floatval($latitude);
        $lon_1 = floatval($longitude);
        $lat_2 = 41.145570;//floatval($latitude2);
        $lon_2 = -8.627014;//floatval($longitude2);
        $delta_lat = $lat_2 - $lat_1 ;
        $delta_lon = $lon_2 - $lon_1 ;
        $alpha    = $delta_lat/2;
        $beta     = $delta_lon/2;
        $a        = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($lat_1)) * cos(deg2rad($lat_2)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
        $c        = asin(min(1, sqrt($a)));
        $distance = 2*$earth_radius * $c;
        $distance = round($distance, 4);
        echo $distance."\n";
          if($distance<=$pesquisa_raio){
            $response = $array['titulo'] . "|";
        }
    } while ($array = mysql_fetch_assoc($query));
        json_encode($response);

コードに何か問題がありますか、それとも結果を理解できないのですか?


解決済み

だから私は動作しないこのコードを持っていますが、私は問題を修正します、これが解決策です:

    $tipo_output = "json"; // pode ser utilizado o json também
               // a sua API KEY do Google Maps gerado com o link acima
                $google_api = "0R4r34bcHA6I0Ppts5oHcxhgoPmdOvt4Hz2cA2w";
               // o endereço que desejamos que o google procure
               // lembrando que o endereço tem que ser no padrão de uma requisição URL e caso possua acentuação, vamos executar um utf8_encode
               $cidade=$array['concelho'];
               echo $cidade;
               $endereco_desejado = urlencode(utf8_encode("$cidade, PT"));
               // Desired address
               $endereco_final = "http://maps.google.com/maps/api/geocode/json?address=". $endereco_desejado ."&sensor=true";
               // conteudo da página
                $string = file_get_contents($endereco_final); // get json content
$json_a = json_decode($string); //json decoder
            //busca da lat e log
            $longitude2 = $json_a->results[0]->geometry->location->lng;
            $latitude2 =$json_a->results[0]->geometry->location->lat;
            //calculo da distancia
            
            $earth_radius = 6371.0;
            $latitude1 = $latitude * pi() / 180.0;
            $longitude1 = $longitude * pi() / 180.0;
            $latitude2 = $latitude2 * pi() / 180.0;
            $longitude2 = $longitude2 * pi() / 180.0;
            
             $dLat = $latitude2 - $latitude1;
             $dLong = $longitude2 - $longitude1;
            
             $a = sin($dLat / 2) * sin($dLat / 2) + cos( $latitude1) * cos($latitude2) * sin($dLong / 2) * sin($dLong / 2);
             
             $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
            
             $resultado=intval($earth_radius * $c); // resultado em km.
4

2 に答える 2

0

入力が壊れています。

$latitude = floatval("%" . $_GET['lat'] . "%");
$longitude = floatval("%" . $_GET['log'] . "%");

あなたがしていることについて考えてください。floatval('%123.4%')から何を取得しても、常にゼロになります$_GET

これらはSQLクエリの残り物のように見えますが、SQLインジェクションを回避するために、別のエスケープ方法(PDOなど)が必要です。


また、不正な形式のクエリを使用してリモートデータを読み込んでいて、結果を無視しているようです。

$endereco=$array['concelho_id'];
$request="http://maps.google.com/maps/api/geocode/json?address='.$endereco.'sensor=false";
$json_data=file_get_contents($request);

これにより、のようなURLが生成されますがhttp://maps.google.com/maps/api/geocode/json?address='.some kind of address.'sensor=false、これは有用な回答を提供することはありません。

  1. 一重引用符とピリオドを含む(二重引用符と一重引用符を混同しているようです)、
  2. 動的部分を適切にエスケープしていない、
  3. &前がありませんsensor=false

(言うまでもなく、最初にループ$arrayを実行したときに初期化されることもありません。)do {} while

于 2012-05-12T06:08:25.553 に答える
0

あなたのコードについてはよくわかりませんが、距離を計算する関数を作成します。

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;
}

Haversine式のcodecodex.comページから取得

C# の式をテストしたところ、問題なく動作しました。

于 2012-05-12T00:04:57.497 に答える