2017-06-24 13 views
1

私はいくつかのマーカーを表示するためにOnMapReadyCallbackを実装しています。 私は基本的に呼び出すことにより、地図上に近い見てみたいターゲット都市を提供マップを開く前に:GoogleMapsでさまざまな都市の適切なズームレベルを取得する

LatLng currentCity = new LatLng(cityLat,cityLng) 
CameraUpdate location = CameraUpdateFactory.newLatLngZoom(currentCity,13); 
googleMap.animateCamera(location); 

ここでの主な問題は、ズームレベルが正常に動作だけで、任意の数であるということですいくつかの都市では他の人には悪い(ズームインし過ぎ、ズームインしていない)。 私が達成したいのは、Googleマップと同じように都市に応じてズームレベルを動的に決定することです。

私は大きな都市のビューポートがある、小さなズームをする必要がありますが、私は与えられた都市のビューポートを取得する方法を見つけることができないし、それに応じて

をズームレベルを変更することを知っています編集:私は

List<Address> addresses = mGeocoder.getFromLocation(Lat,Lon,maxLimit); 

を使用して、都市の緯度と経度を使用してアドレスのリストを取得するためにジオコーダを使用してのことを考えて、その都市のためのavaible最も外側の住所がを見つけるために、このリストを反復処理、順番にされましたsetLatLngBoundsForCameraTarget()メソッドで渡すLatLngBoundsを構築します。 このアプローチの主な問題は、「maxLimit」は任意であり、大都市にとっては非常に大きく、最終的には本当に大きなリストを返す必要があることです。

+0

私は良い長期的な解決策は都市を含むプロパティファイルと各都市に必要なズームレベルを使用することだと思います。各都市に必要なズームレベルは時間の経過とともに変化する可能性があることに注意してください。 –

+0

ええ、私は同じと思ったが、私はデータベース内の各都市を支配していない。私が何を意味するかは、ユーザーがリストに載っていない本当に小さな都市にマーカーを追加することができるということです.JS APIがこの問題を解決するためのいくつかの興味深い機能を提供していますが、Javascriptのレベルは最高と言えば普通です –

+1

Upvoted 。私は今でもAndroid上の地図を使って作業しています。しかし、私は都市の小さなリストを扱っているだけなので、単一の値をハードコーディングして取り除くことができます。 –

答えて

1

都市のビューポートを取得できますGeocoding API reverse geocodingレスポンス。

あなたのアクティビティから都市ビューポートを取得するには、HTTPリクエストを実行する必要があります。応答を受け取ると、LatLngBoundsインスタンスを構築し、それに従ってカメラを移動することができます。

サンプルは、私は、意図から緯度とLNGを受け取る地図の活動のための小さな例を書いたバレーボールのライブラリを使用して、逆ジオコーディングHTTPリクエストを実行し、 https://maps.googleapis.com/maps/api/geocode/json?latlng=47.376887%2C8.541694&result_type=locality&key=YOUR_API_KEY

以下れる座標から街を取得し、要求を逆ジオコーディング都市ビューポートを表示するカメラを移動します。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap mMap; 
    private float lat; 
    private float lng; 
    private String name; 
    private RequestQueue mRequestQueue; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent i = getIntent(); 
     this.lat = i.getFloatExtra("lat", 0); 
     this.lng = i.getFloatExtra("lng", 0); 
     this.name = i.getStringExtra("name"); 

     mRequestQueue = Volley.newRequestQueue(this); 

     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     // Add a marker in Sydney and move the camera 
     LatLng pos = new LatLng(this.lat, this.lng); 
     mMap.addMarker(new MarkerOptions().position(pos).title(this.name)); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(pos)); 

     this.fetchReverseGeocodeJson(); 
    } 

    private void fetchReverseGeocodeJson() { 
     // Pass second argument as "null" for GET requests 
     JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET, 
       "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + this.lat + "%2C" + this.lng + "&result_type=locality&key=AIzaSyBrPt88vvoPDDn_imh-RzCXl5Ha2F2LYig", 
       null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          String status = response.getString("status"); 
          if (status.equals("OK")) { 
           JSONArray results = response.getJSONArray("results"); 
           JSONObject item = results.getJSONObject(0); 
           JSONObject geom = item.getJSONObject("geometry"); 
           JSONObject bounds = geom.getJSONObject("viewport"); 
           JSONObject ne = bounds.getJSONObject("northeast"); 
           JSONObject sw = bounds.getJSONObject("southwest"); 

           LatLngBounds mapbounds = new LatLngBounds(new LatLng(sw.getDouble("lat"),sw.getDouble("lng")), 
             new LatLng(ne.getDouble("lat"), ne.getDouble("lng"))); 

           mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(mapbounds, 0)); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.e("Error: ", error.getMessage()); 
        } 
       } 
     ); 

     /* Add your Requests to the RequestQueue to execute */ 
     mRequestQueue.add(req); 
    } 
} 

あなたはgithubのに完全なサンプルプロジェクトを見つけることができます。

https://github.com/xomena-so/so44735477

ホープ、このことができます!

関連する問題