0

完全なアドレスデータが返されることを期待して、lat/lngでリクエストを行うGooglemapAPIV3を使用しています。ただし、私のPHPプログラムは、たとえば、郵便番号が返されることがあります。返されるもののvar_dumpを実行しました。余分なオブジェクト要素が表示されますが、これが原因である可能性があります。PHPのオブジェクトがどのように機能するかについてもすべてを知っているわけではない可能性があります。対象領域のvar_dump出力は次のとおりです。最初の例は実際に要求を行っているPHPプログラムに郵便番号を返しますが、2番目の例はそれを失敗し、「非オブジェクトのプロパティを取得しようとしています...」というエラーを返します。これとあなたの有用なコメントを見てくれてありがとう。

これは、Google Map APIV3から返される$xmlのvar_dumpです。これは機能せず、郵便番号を正しく返すことができません。

object(SimpleXMLElement)#1 (1) {
  ["Response"]=>
  object(SimpleXMLElement)#2 (3) {
    ["name"]=>
    string(24) "40.74005999,-73.99718229"
    ["Status"]=>
    object(SimpleXMLElement)#3 (2) {
      ["code"]=>
      string(3) "200"
      ["request"]=>
      string(7) "geocode"
    }
    ["Placemark"]=>
    object(SimpleXMLElement)#4 (5) {
      ["@attributes"]=>
      array(1) {
        ["id"]=>
        string(2) "p1"
      }
      ["address"]=>
      string(38) "136 W 17th St, New York, NY 10011, USA"
      ["AddressDetails"]=>
      object(SimpleXMLElement)#5 (2) {
        ["@attributes"]=>
        array(1) {
          ["Accuracy"]=>
          string(1) "8"
        }
        ["Country"]=>
        object(SimpleXMLElement)#8 (3) {
          ["CountryNameCode"]=>
          string(2) "US"
          ["CountryName"]=>
          string(3) "USA"
          ["AdministrativeArea"]=>
          object(SimpleXMLElement)#9 (2) {
            ["AdministrativeAreaName"]=>
            string(2) "NY"
            ["SubAdministrativeArea"]=>
            object(SimpleXMLElement)#10 (2) {
              ["SubAdministrativeAreaName"]=>
              string(8) "New York"
              ["Locality"]=>
              object(SimpleXMLElement)#11 (2) {
                ["LocalityName"]=>
                string(8) "New York"
                ["DependentLocality"]=>
                object(SimpleXMLElement)#12 (3) {
                  ["DependentLocalityName"]=>
                  string(9) "Manhattan"
                  ["Thoroughfare"]=>
                  object(SimpleXMLElement)#13 (1) {
                    ["ThoroughfareName"]=>
                    string(13) "136 W 17th St"
                  }
                  ["PostalCode"]=>
                  object(SimpleXMLElement)#14 (1) {
                    ["PostalCodeNumber"]=>
                    string(5) "10011"
                  }
                }
              }
            }
          }
        }
      }
      ["ExtendedData"]=>
      object(SimpleXMLElement)#6 (1) {
        ["LatLonBox"]=>
        object(SimpleXMLElement)#8 (1) {
          ["@attributes"]=>
          array(4) {
            ["north"]=>
            string(10) "40.7414089"
            ["south"]=>
            string(10) "40.7387109"
            ["east"]=>
            string(11) "-73.9958332"
            ["west"]=>
            string(11) "-73.9985312"
          }
        }
      }
      ["Point"]=>
      object(SimpleXMLElement)#7 (1) {
        ["coordinates"]=>
        string(24) "-73.9971822,40.7400599,0"
      }
    }
  }
}

上記には次のエラーがあります。

PHP Notice:  Trying to get property of non-object in try.php on line 38
PHP Notice:  Trying to get property of non-object in try.php on line 41

これらの行のPHPコードは次のとおりです。

$status = $xml->Response->Status->code;
// Country
$country = $xml->Response->Placemark->AddressDetails->Country;
$country_code = $country->CountryNameCode;
$country_name = $country->CountryName;

// Address
$address_line = $xml->Response->Placemark->address;

// Street address
$Locality = $country->AdministrativeArea->Locality;
// var_dump($Locality);
$street = $country->AdministrativeArea->Locality->Thoroughfare->ThoroughfareName;
$city = $country->AdministrativeArea->Locality->LocalityName;
$state = $country->AdministrativeArea->AdministrativeAreaName;
$zip_code = $country->AdministrativeArea->Locality->PostalCode->PostalCodeNumber;

41行目は$zip_codeを含むコードの最後の行であり、38行目は$streetで始まるコードの行です。

上記には["SubAdministrativeArea"]=>が含まれていますが、以下の作業例には含まれていません。これは重要ですか?

object(SimpleXMLElement)#1 (1) {
  ["Response"]=>
  object(SimpleXMLElement)#2 (3) {
    ["name"]=>
    string(24) "40.74445606,-73.97495072"
    ["Status"]=>
    object(SimpleXMLElement)#3 (2) {
      ["code"]=>
      string(3) "200"
      ["request"]=>
      string(7) "geocode"
    }
    ["Placemark"]=>
    object(SimpleXMLElement)#4 (5) {
      ["@attributes"]=>
      array(1) {
        ["id"]=>
        string(2) "p1"
      }
      ["address"]=>
      string(38) "317 E 34th St, New York, NY 10016, USA"
      ["AddressDetails"]=>
      object(SimpleXMLElement)#5 (2) {
        ["@attributes"]=>
        array(1) {
          ["Accuracy"]=>
          string(1) "8"
        }
        ["Country"]=>
        object(SimpleXMLElement)#8 (3) {
          ["CountryNameCode"]=>
          string(2) "US"
          ["CountryName"]=>
          string(3) "USA"
          ["AdministrativeArea"]=>
          object(SimpleXMLElement)#9 (2) {
            ["AdministrativeAreaName"]=>
            string(2) "NY"
            ["Locality"]=>
            object(SimpleXMLElement)#10 (3) {
              ["LocalityName"]=>
              string(8) "New York"
              ["Thoroughfare"]=>
              object(SimpleXMLElement)#11 (1) {
                ["ThoroughfareName"]=>
                string(13) "317 E 34th St"
              }
              ["PostalCode"]=>
              object(SimpleXMLElement)#12 (1) {
                ["PostalCodeNumber"]=>
                string(5) "10016"
              }
            }
          }
        }
      }
      ["ExtendedData"]=>
      object(SimpleXMLElement)#6 (1) {
        ["LatLonBox"]=>
        object(SimpleXMLElement)#8 (1) {
          ["@attributes"]=>
          array(4) {
            ["north"]=>
            string(10) "40.7458050"
            ["south"]=>
            string(10) "40.7431070"
            ["east"]=>
            string(11) "-73.9736017"
            ["west"]=>
            string(11) "-73.9762997"
          }
        }
      }
      ["Point"]=>
      object(SimpleXMLElement)#7 (1) {
        ["coordinates"]=>
        string(24) "-73.9749507,40.7444560,0"
      }
    }
  }
}

そして、これが出力に使用されるコード行で、最初の例では$ zip_codeが空白ですが、2番目の例では期待どおりに機能します。

echo "===================================\n";
echo "Status code is: " . $status . "\n";
echo "address line is:" . $address_line . "\n";
echo "=+=+=" . "\n";
echo "street is: " . $street . "\n";
echo "city is: " . $city . "\n";
echo "state is: " . $state . "\n";
echo "zip code is: " . $zip_code . "\n";
echo "country code is: " . $country_code . "\n";
echo "country name is: " . $country_name. "\n";

この例で使用されているさまざまな場所は、どちらもニューヨーク市にあります。一方が機能しているのにもう一方が機能していない理由はわかりません。["SubAdministrativeArea"]が返されることを期待してください。GoogleマップAPIV3は、同じエリアに対して同じ形式の情報を返すべきではありませんか?これは私が抱えている問題の要因でもありますか?オブジェクトと要素を正しく処理していませんか?もしそうなら、私はこの時点で立ち往生しているので、私を教えてください。

または、GoogleマップAPI V3によって返される可能性のある2つの異なる状況(またはそれ以上?)をチェックする必要がありますか?ありがとう!

4

1 に答える 1

2

上記には["SubAdministrativeArea"]=>が含まれていますが、以下の作業例には含まれていません。これは重要ですか?

はい、それは重要です。

GoogleマップAPIV3は、同じエリアに対して同じ形式の情報を返すべきではありませんか?

回答の一部の要素は常に結果ツリーの同じ場所に存在しますが、その他の要素はリクエストに依存します。リクエストが非常に似ている場合でも、サブレベルが増えることがある理由がわからなかったため、これについてはこれ以上お役に立てません...

これは私が抱えている問題の要因でもありますか?

はい、固定された結果構造に依存することはできないためです。

GoogleマップAPIV3によって返される可能性のある2つの異なる状況(またはそれ以上?)をチェックする必要がありますか?

別の解決策は、SimpleXML以外のライブラリを使用して結果を処理することです。DOMのように、 DOMElement::getElementsByTagNameのようにツリーから子を検索する関数があります。値を取得するには、SimpleXMLを使用する場合よりも少し多くのコーディングが必要ですが、この方法では、SubAdministrativeAreaレベルがあるかどうかを確認する必要はありません。

お役に立てば幸いです。

于 2012-10-15T14:31:19.567 に答える