2012-12-27 40 views
0

我正在嘗試獲取位置或想通過傳遞位置名稱在地圖上顯示位置。
我做了一個示例項目,在地圖上顯示當前位置。但我不明白如何在Google地圖上傳遞名稱和搜索位置。
這是我的代碼,可以幫助你理解我的問題。未按名稱獲取Google地圖上的位置

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mapView = (MapView) findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); 
    mapView.setSatellite(true); 
    mapController = mapView.getController(); 
    mapController.setZoom(14); // Zoom 1 is world view 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
     0, new GeoUpdateHandler()); 

    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    mapView.getOverlays().add(myLocationOverlay); 

    String value = "kasarwadi,pune"; 
    // Do something with value! 


    Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());  
     try { 
      List<Address> addresses = geoCoder.getFromLocationName(
       value, 5); 
      String add = ""; 
      if (addresses.size() > 0) { 
      GeoPoint p = new GeoPoint(
         (int) (addresses.get(0).getLatitude() * 1E6), 
         (int) (addresses.get(0).getLongitude() * 1E6)); 
       mapController.animateTo(p);  
       mapView.invalidate(); 
      }  
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    myLocationOverlay.runOnFirstFix(new Runnable() { 
     public void run() { 
     mapView.getController().animateTo(myLocationOverlay.getMyLocation()); 
     } 
    }); 

    Drawable drawable = this.getResources().getDrawable(R.drawable.point); 
    itemizedoverlay = new MyOverlays(this, drawable); 
    createMarker(); 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
    return false; 
    } 

    public class GeoUpdateHandler implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     String value = "kasarwadi,pune"; 
     // Do something with value! 


     Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());  
      try { 
       List<Address> addresses = geoCoder.getFromLocationName(
        value, 5); 
       String add = ""; 
       if (addresses.size() > 0) { 
       GeoPoint p = new GeoPoint(
          (int) (addresses.get(0).getLatitude() * 1E6), 
          (int) (addresses.get(0).getLongitude() * 1E6)); 
        mapController.animateTo(p);  
        mapView.invalidate(); 
       }  
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
    } 

    private void createMarker() { 
    GeoPoint p = mapView.getMapCenter(); 
    OverlayItem overlayitem = new OverlayItem(p, "", ""); 
    itemizedoverlay.addOverlay(overlayitem); 
    if (itemizedoverlay.size() > 0) { 
     mapView.getOverlays().add(itemizedoverlay); 
    } 
    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); 
    } 

    @Override 
    protected void onPause() { 
    super.onPause(); 
    myLocationOverlay.disableMyLocation(); 
    myLocationOverlay.disableCompass(); 
    } 

我也生成MD5指紋和有效的API密鑰。但是當我試圖顯示它只顯示當前位置,但我需要顯示哪個名稱通過我的位置。
請給我一個參考或提示。
在此先感謝。

+0

它指向哪裏?在浦那周圍或完全不同的位置? –

+0

浦那周圍的某處... –

回答

0

我在我的模擬器上也遇到了類似的問題,可能它會在設備上工作(沒有在設備上測試過它!),所以我如何解決這個問題是通過使用另一個原始API將地址轉換爲地址...

所以,我建議不要刪除或改變你當前的代碼(因爲它看起來對我來說很好,誰知道最終可能會在設備場景中工作),但是在你的方法中調用這個方法tryAlternative() catch(IOException)子句。我寫下tryAlternative()

private void tryAltesrnative(String address) { 

    String strCompleteAddress = address.replaceAll(" ", "%20"); 
    String streetName = strCompleteAddress.substring(strCompleteAddress.indexOf(",")+1); 
    String cityName = streetName.substring(streetName.indexOf(",")+1); 
    String addressToToast = ""; 


    HttpGet httpGet = new HttpGet("http://maps.google." + "com/maps/api/geocode/json?address=" + address + "ka&sensor=false"); 


    HttpClient client = new DefaultHttpClient(); 
    HttpResponse response; 
    StringBuilder stringBuilder = new StringBuilder(); 

    try { 
     response = client.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     InputStream stream = entity.getContent(); 
     int b; 
     while ((b = stream.read()) != -1) { 
      stringBuilder.append((char) b); 
     } 
    } catch (ClientProtocolException e) { 
    } catch (IOException e) { 
    } 

    JSONObject jsonObject = new JSONObject(); 
    try { 
     jsonObject = new JSONObject(stringBuilder.toString()); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



    Double lon = new Double(0); 
    Double lat = new Double(0); 

    try { 

     lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0) 
      .getJSONObject("geometry").getJSONObject("location") 
      .getDouble("lng"); 

     lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0) 
      .getJSONObject("geometry").getJSONObject("location") 
      .getDouble("lat"); 

    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 








    point = new GeoPoint((int) (lat * 1E6), (int) (lon * 1E6)); 

    mapController.animateTo(point); 
    mapController.setZoom(12); 

    List<Overlay> mapOverlays = mapView.getOverlays(); 
    Drawable drawable = this.getResources().getDrawable(R.drawable.mark_green); 
    AddItemizedOverlay itemizedOverlay = new AddItemizedOverlay(drawable, this); 

    OverlayItem overlayitem = new OverlayItem(point, "Customer", addressToToast); 

    itemizedOverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedOverlay); 
    mapView.invalidate(); 

    Toast.makeText(this, "Lat: " + point.getLatitudeE6() +", Lon: "+ point.getLongitudeE6() + "Address: " + addressToToast, Toast.LENGTH_LONG).show(); 

} 
0

因爲你所要求的5個地址

List<Address> addresses = geoCoder.getFromLocationName(value, 5); 

的最大值有一個機會,5號或最後一個位置的經度和緯度是從第1個值(這是比較合適的)完全不同。

並且您正嘗試爲最後位置設置動畫。嘗試動畫到第一個位置。