1

私は自分の最初のウェブページをデザインしています。これは、一部のユーザーがオープンハウス情報を追加し、他のユーザーが情報を引き出すことができる不動産ページです。データベースと Web のコードは非常に優れており (2 か月後...)、データの挿入と取得は快適です... 今度は Google マップです。私は trulia のようなものや、非常にオリジナルな Housingmaps.com を作ろうとしています(彼らがマッシュアップを始めたようですよね?)。また、crimereports.com も非常に優れています。

目標: データベースから住所を取得し、ジオコードから経度と緯度を取得し、テーブルに挿入して、Google マップに表示します。さらに、人々がマップをパンすると、新しい情報がマップに表示されます。

これは、住所、地理コードを取得し、緯度と経度をデータベースに追加するためのコードです。

<?php
//require("phpsqlajax_dbinfo.php");

// Opens a connection to a MySQL server
$username = "abc"; //personal info changed to abc
$password = "abc";
$hostname = "abc"; 
$database = "abc";
$connection = mysqli_connect($hostname, $username, $password);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//if (!$connection) {
  //die("Not connected : " . mysql_error());
//}

define("MAPS_HOST", "maps.google.com");
define("KEY", "my .............key........code");



// Set the active MySQL database
$db_selected = mysqli_select_db($connection, $database);
if (!$db_selected) {
  die("Can\'t use db : " . mysql_error());
}

// Select all the rows in the markers table
$query = "SELECT * FROM brokerstour.property WHERE 1";
$result = mysqli_query($connection, $query);
if (!$result) {
  die("Invalid query: " . mysql_error());
}

// Initialize delay in geocode speed
$delay = 0;
$base_url = "http://maps.googleapis.com/maps/api/geocode/output?parameters";

// Iterate through the rows, geocoding each address
while ($row = @mysqli_fetch_assoc($result)) {
  $geocode_pending = true;

  while ($geocode_pending) {
    $address = $row["address"];
    $id = $row["id"];
    $request_url = $base_url . "&q=" . urlencode($address);
    $xml = simplexml_load_file($request_url) or die("url not loading");

    $status = $xml->Response->Status->code;
    if (strcmp($status, "200") == 0) {
      // Successful geocode
      $geocode_pending = false;
      $coordinates = $xml->Response->Placemark->Point->coordinates;
      $coordinatesSplit = split(",", $coordinates);
      // Format: Longitude, Latitude, Altitude
      $lat = $coordinatesSplit[1];
      $lng = $coordinatesSplit[0];

      $query = sprintf("UPDATE property " .
             " SET lat = '%s', lng = '%s' " .
             " WHERE id = '%s' LIMIT 1;",
             mysql_real_escape_string($lat),
             mysql_real_escape_string($lng),
             mysql_real_escape_string($id));
      $update_result = mysql_query($query);
      if (!$update_result) {
        die("Invalid query: " . mysql_error());
      }
    } else if (strcmp($status, "620") == 0) {
      // sent geocodes too fast
      $delay += 100000;
    } else {
      // failure to geocode
      $geocode_pending = false;
      echo "Address " . $address . " failed to geocoded. ";
      echo "Received status " . $status . "
\n";
    }
    usleep($delay);
  }
}
?>

Google チュートリアル (元のコード) に変更した内容は次のとおりです。 1) エラーを回避するために php: mysqli を更新しました。これ以上phpエラーが発生しません。2) URL を "http://" から変更しました。MAPS_HOST . "/maps/geo?output=xml" . "&key=" . 鍵; TO " http://maps.googleapis.com/maps/api/geocode/output?parameters " コードを API v3 に更新しようとしています。

古い URL を使用すると、エラー 610 が発生します。新しい URL を使用すると、次のようになります。


( ! ) SCREAM: エラー抑制は無視されました ( ! ) 警告: simplexml_load_file(): I/O 警告: 外部エンティティ "maps.googleapis.com/maps/api/geocode/output?parameters&q=4200+Park+Blvd+ の読み込みに失敗しました" in C:.... 57 行目 .....

URLがロードされていません

完全な開示:私は非常に新しいので、上記は意味をなさないかもしれません。しかし、私はこの問題に1週間立ち往生しています。(ちなみに、Google マップを初めて使用する場合は、Beginning Google API 3 という本が必読です。ただし、データベースは扱っていませんが、Google マップ API について非常によく説明しています)。

誰かヒント、本、チュートリアルを教えてください。どんな助けも大きな助けです。お時間をいただきありがとうございます。

57 行目は $xml = simplexml_load_file($request_url) or die("url not loading"); です。

4

2 に答える 2

1

これは部分的な成功です。このコードは次のことを実行します。a) テーブルからアドレスを取得します。b) Google から lat と lnt を取得します。c) データをテーブルに挿入します。

私はまだ遅延に取り組む必要があります。その上、私は生後 3 か月のプログラマーです...そして、上記の作業を行うのに 2 週間かかりました...参照用に遅延をそこに残しました (これは、Web の他の人からの変更を加えた Google からのチュートリアルでした. )

Strachan さんからの回答に賛成票を投じようとしましたが、スタック オーバーフロー内で評判がありません... できませんでした。その修正も機能します。お時間をいただきありがとうございます。

<?php

$conn = mysql_connect('localhost', 'rxxt', 'xxxxxxx');
if(!$conn)
 {
   echo "Database Error.";
 }
 else
 {
   echo "Connected.";
   mysql_select_db('YOUR TABLE', $conn);
   $query = "SELECT * from YOUR TABLE";
   $result = mysql_query($query, $conn) or die($query.mysql_error());
    while($row = mysql_fetch_array($result))
    { 

      $address = $row['address'];
      $id = $row['id'];

      $loc_address = str_replace(" ", "+", $address); //to replace spaces by '+' signs
          $location = $loc_address;
      echo $location."<br>";
      $delay = 0;  // this delay is here just to avoid errors - 
          $url = "http://maps.google.com/maps/api/geocode/json?address=".$location."&sensor=false";
          echo $url;
            $output=file_get_contents($url);
            $out= json_decode($output);
            $lat = $out->results[0]->geometry->location->lat;
            $lng = $out->results[0]->geometry->location->lng;
            echo '<br>Lat is '. $lat;
            echo '<br>Long is '. $lng;


       $query = sprintf("UPDATE YOUR TABLE " .
             " SET lat = '%s', lng = '%s' " .
             " WHERE id = '%s' LIMIT 1;",
             mysql_real_escape_string($lat),
             mysql_real_escape_string($lng),
             mysql_real_escape_string($id));
           $update_result = mysql_query($query);

      echo "Successfully inserted.";
    // Below is just for reference - they say we need the delay. The may problem: does not get the status to compare to 200, 620, etc.   
    /*$status = $xml->Response->Status->code;  
    if (strcmp($status, "200") == 0) {
            // Successful geocode
            echo '<br />successfull geocode</strong><br />';
            $geocode_pending = false;
    }
    else if (strcmp($status, "620") == 0) {
         // sent geocodes too fast
         $delay += 100000;
            } else {
         // failure to geocode
         $geocode_pending = false;
         echo "Address " . $address . " failed to geocoded. ";
         echo "Received status " . $status . "
        \n";
          }*/
    usleep($delay); 
    }
 }
mysql_close($conn);
?>
于 2013-04-10T17:05:37.057 に答える