3

だから..私はおそらく非常に一般的な問題に遭遇します。

グーグルマップAPIの実装を開始したばかりです。以下は、都市をlat / langに解決し、マップを中央に配置するためのコードです。

function SetMapAddress(address) {  // "London, UK" for example 
  var geocoder = new google.maps.Geocoder();
  if (geocoder) {
     geocoder.geocode({ 'address': address }, function (results, status) {
     if (status == google.maps.GeocoderStatus.OK) {
        var loc = results[0].geometry.location;
        document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13));
     }

問題は、静的ズーム(13)を通過していることです。

誰かが国の名前を入力した場合は、もっとズームアウトしたいと思います。都市の場合はもっとズームインしたいなど。

私が考えることができる唯一のことは、すべての都市と国に適切なズームを見つけ、それらをハッシュに保存し、使用されているものを見つけて、適切なズームを渡すことです。

多分グーグルはもっとインテリジェントなアプローチを考えましたか?

4

3 に答える 3

8

ジオコーダは「推奨」ビューポートを返します

次のように SetMapAddress 関数で使用できます。

 function SetMapAddress(address) {  // "London, UK" for example 
   var geocoder = new google.maps.Geocoder();
   if (geocoder) {
      geocoder.geocode({ 'address': address }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          document.map.fitBounds(results[0].geometry.viewport);
        }
      });
   }
 }
于 2012-07-05T02:37:13.047 に答える
1

ジオコーディングの結果は、クエリのアドレスコンポーネントタイプaddress_componentsを含む配列を提供します。

私の非常に限られたテストから、クエリに追加される情報が多いほど、このaddress_components配列は長くなります。「フランス」に入るときは、次のようになります。

> Object
long_name: "France"
short_name: "FR"

types: Array[2]
> 0: "country"
> 1: "political"

都市が追加されると、「地域」という名前のタイプがあります。したがって、この配列をトラバースして、long_namesとユーザーが入力した内容が一致するかどうかを確認できます。都市または国のみを入力する場合は簡単ですが、ローマ/ローマイタリア(スペルの違い)など、さまざまなバリエーションがあります。 、およびユーザーが都市と国の両方を入力した場合は、都市を優先する必要があります。

結局、ユーザー入力を場所の可能な表現に一致させるために独自のハッシュを作成したとしても、それは非常にあいまいな検索と一致のように聞こえます。

これが私の怠惰なアプローチです:

作成var mapZoom = 13;(都市であると想定)

ユーザー入力全体が実際に国名であるかどうかを確認します。long_nameと一致し、エントリのタイプが「国」である場合は、mapZoomを5に下げます。

このmapZoom変数を使用してsetCenterを適用します。

于 2012-07-05T01:46:00.243 に答える
0

別の (場合によっては問題となる) 解決策は、address_components 配列の長さを数えることです。

Tina CG Hoehr が別の回答で述べたように、places オブジェクトには address_components 配列があります。配列は、アドレスのさまざまな部分を保持します。

address_components 配列の長さをテストし、ズーム レベルを適切に設定できます。

あなたのコード例に基づいて、

function SetMapAddress(address) {  // "London, UK" for example 
    var geocoder = new google.maps.Geocoder();
    if (geocoder) {
        geocoder.geocode({ 'address': address }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var loc = results[0].geometry.location;



            // Test address_components
            var ac_length = results[0].address_components.length;

            if (ac_length == 1) {
                // Assume country
                document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 3));

            } else if (ac_length == 2) {
                // Assume city
                document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 7));

            } else {
                // Everything else can have a standard zoom level
                document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13));
            }



        }
    }
}

この方法うまくいくようです。オーストラリアの住所でテストしたところ、郊外に郵便番号があるものとないものがあることがわかりました-配列の長さを変更します。郵便番号のないものは人口の少ない地域にあるように見えましたが、それらのズームを低くすることは私の目的に適していました.

于 2013-08-05T11:45:05.533 に答える