0

私はiosから緯度と経度の座標の出力を取得しようとしています(これは正常に機能しています)、それをphpに送信してMySQLでクエリを実行し、phpにxmlドキュメントをiosに返送させます(この手順は機能していませんその場所にmysqlエントリを戻さないでください)、iOS UItableviewで解析します(これも正常に機能しています)。私はこれをXMLで動作させようとしています。これは、より単純なxmlスクリプトがすでに実行されているためです。しかし、おそらくphpの経験不足による間違いが原因で、このphpスクリプトを機能させることができません!PHPスクリプトで何が間違っているのですか?ありがとう!ああ、そしてまた、mysqlのデータカテゴリは「lon」と「lat」と「name」(近くの友人や家族の名前)で構成されています!そして、誰かが疑問に思っていた場合に備えて、iOSの緯度と経度のphpクエリがxml出力で近くのmysqllatとlonを検索していません

<?php
    define( 'LATMILES', 1 / 69 );
    define( 'LONMILES', 1 / 53 );
    if ( isset( $_GET['lat'] ) ) { $lat = (float)$_GET['lat']; }  //Recieve ios input from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g&radius=100&q=%@", latitude, longitude, searchBar.text?searchBar.text:@""];
    if ( isset( $_GET['lon'] ) ) { $lon = (float)$_GET['lon']; }  //Recieve ios input from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g&radius=100&q=%@", latitude, longitude, searchBar.text?searchBar.text:@""];
    if ( isset( $_GET['radius'] ) ) { $radius = (float)$_GET['radius']; } //Recieve ios input from: NSString *urlString = [NSString stringWithFormat:@"http://www.mysite.com/loc.php?lat=%g&lon=%g&radius=100&q=%@", latitude, longitude, searchBar.text?searchBar.text:@""];
    $minlat = $lat - ( $radius * LATMILES );
    $minlon = $lon - ( $radius * LONMILES );
    $maxlat = $lat + ( $radius * LATMILES );
    $maxlon = $lon + ( $radius * LONMILES );
    $dbh = new PDO('(censored private information');
    $sql = 'SELECT lat, lon, name FROM locations WHERE lat >= ? AND lat <= ? AND lon >= ? AND lon <= ?';
    $params = array( $minlat, $maxlat, $minlon, $maxlon );
    if ( isset( $_GET['q'] ) ) {
      $sql .= " AND name LIKE ?";
      $params []= '%'.$_GET['q'].'%';
    }
    $q = $dbh->prepare( $sql );
    $q->execute( $params );
    $doc = new DOMDocument();
    $r = $doc->createElement( "locations" );
    $doc->appendChild( $r );
    foreach ( $q->fetchAll() as $row) {
      $dlat = ( (float)$row['lat'] - $lat ) / LATMILES;
      $dlon = ( (float)$row['lon'] - $lon ) / LONMILES;
      $d = sqrt( ( $dlat * $dlat ) + ( $dlon * $dlon ) );
      if ( $d <= $radius ) {
        $e = $doc->createElement( "location" );
        $e->setAttribute( 'lat', $row['lat'] );
        $e->setAttribute( 'lon', $row['lon'] );
        $e->setAttribute( 'name', $row['name'] );
        $r->appendChild( $e );
      }
    }
    print $doc->saveXML();
?>
4

1 に答える 1

0

あなたのコードは非常に複雑です。まず、場所を見つけるための最良の解決策は、Haversine_formulaを使用することです。

私はそれを使用するためにあなたのコードを単純化しました。

<?php
if (isset( $_GET['lat'])){ 
    $lat = (float)$_GET['lat']; 
}  
if ( isset( $_GET['lon'])){ 
    $lon = (float)$_GET['lon']; 
}  
if ( isset( $_GET['radius'])){ 
    $radius = (float)$_GET['radius'];
} 
if ( isset( $_GET['q'])){ 
    $name = $_GET['q'];
} 

$dbh = new PDO('(censored private information');
//
$sql = "SELECT  name, lat, lon, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat) ) * cos( radians( lon ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lon) ) ) ) AS distance FROM location WHERE `name` LIKE '%s' HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
mysql_real_escape_string($lat),
mysql_real_escape_string($lon),
mysql_real_escape_string($lat),
mysql_real_escape_string($name),
mysql_real_escape_string($radius));

$q = $dbh->prepare( $sql );
$q->execute( $params );
$doc = new DOMDocument();
$r = $doc->createElement( "locations" );
$doc->appendChild( $r );
foreach ( $q->fetchAll() as $row) {
  //$dlat = ( (float)$row['lat'] - $lat ) / LATMILES;
  //$dlon = ( (float)$row['lon'] - $lon ) / LONMILES;
  //]$d = sqrt( ( $dlat * $dlat ) + ( $dlon * $dlon ) );
  //if ( $d <= $radius ) {
    $e = $doc->createElement( "location" );
    $e->setAttribute( 'lat', $row['lat'] );
    $e->setAttribute( 'lon', $row['lon'] );
    $e->setAttribute( 'name', $row['name'] );
    $r->appendChild( $e );
  //}
}
echo $doc->saveXML();
?>

必須ではないと思うので、コードの一部をコメントアウトしました。

私もに変更print $doc->saveXML();しましたecho $doc->saveXML();

$lat =55.00;また、必要な出力が確実に得られるように、パラメーターなどをハードコーディングしてみます。

上記の式は、マイルをkmに変更するために、3959ではなく6371を使用します。

于 2012-10-14T12:23:30.470 に答える