1

現在、GoogleMaps から座標を取得するために次のメソッドを使用しています。これをより短く/より効率的に書くことはできますか?

編集 21.06.2013

現在、古いGoogle Geocoding APIはオフになっています。これは、最新バージョンで動作する私の修正済みコードです。誰かがつまずいて役に立つと思ったら、この投稿を更新しました。

public function getGeographicCoordinatesFromGoogle()
{
    // create address string
    $value = $this->address_line_1 . ' ' .
             $this->postal_code . ' ' .
             $this->city . ' ' .
             $this->country;
    $value = preg_replace('!\s+!', '+', $value);

    // create request
    $request = 'http://maps.googleapis.com/maps/api/geocode/xml?address=' .
               $value . '&sensor=false';

    // get value from xml request
    $xml = file_get_contents($request);
    $doc = new \DOMDocument('1.0', 'UTF-8');
    @$doc->loadXML($xml);

    // fetch result
    $result = $doc->getElementsByTagName('lat')->item(0)->nodeValue . ',' .
              $doc->getElementsByTagName('lng')->item(0)->nodeValue;

    // check result
    if (!preg_match('/(-?\d+\.\d+),(-?\d+\.\d+)/', $result) ) {
        $result = null;
    }
    // assign value
    $this->setGeographicCoordinates($result);
}
4

2 に答える 2

1

xml の代わりに json を使用できます。json は新しく、軽量で、オブジェクト指向です。

于 2013-06-21T09:45:46.087 に答える
0

正規表現で SearchQuery を構築しようとする代わりに、http_build_query() を使用することをお勧めします。エスケープする必要がある他の文字があります。

これはかなり長い方法です。おそらく、GoogleMaps との通信のみを処理する 1 つのクラス (座標などを要求できる GeoData-Object を返すメソッド getGeoDataForAddress() を持つクラス GeoBackend) を持つことは理にかなっているでしょう。

于 2012-10-11T13:50:20.580 に答える