2013-03-07 9 views
15

Ho un'app di Google Maps che cattura i valori lat e long degli utenti, e attraverso l'uso di una risposta di JSON di Google memorizza una gamma di oggetti supermercato con i relativi valori lat e long. Uso una classe overlay per posizionare un marker sulla mappa dipendente dal supermercato selezionato dalla listview che mostra i supermercati disponibili.Problema di accuratezza delle mappe di Google

Questo funziona perfettamente, in cui sembra che si stia verificando un problema con la precisione della classe di overlay. L'indicatore della mappa non sembra molto accurato, in quanto il marker punta al punto sbagliato del lat e long point specificato che è passato dal mio oggetto geopoint. (a volte fino a 11 miglia di distanza da dove dovrebbe essere).

Ho provato a dichiarare LOCATION_FINE nel mio manifest sui permessi di utilizzo ma questo non sembra fare alcuna differenza. Ho bisogno di questo perché sto usando una risposta JSON piuttosto che GPS?

Quanto è accurata la mappa sull'emulatore? Potrei avere a portata di mano qui, ma ho sentito diverse persone dire che quando si utilizzano le API di Google sull'emulatore non è così preciso.

Nessun GPS è in uso.

MODIFICA

Per aggiungere a questa domanda. Ho un'altra domanda che approfondisce. Credo che il problema sia all'interno del mio metodo update() poiché il problema è rappresentato dal valore errato dell'oggetto lat e vengono inviati lunghi valori al marker.

Inserirò il mio codice, solo per vedere se qualcuno può trovare eventuali problemi.

classe GeoName: classe

public class GeoName { 

private String id; 
private Geometry geometry; 
private String name; 

public String getId() { 
    return id; 
} 
public void setId(String id) { 
    this.id = id; 
} 
public Geometry getGeometry() { 
    return geometry; 
} 
public void setGeometry(Geometry geometry) { 
    this.geometry = geometry; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 

} 

PostalCodeAdapter:

package com.example.restfulweb; 

public class PostalCodeAdapter extends BaseAdapter { 

private Context ctx = null; 
Location l; 
Dialog d; 
Double Latt; 
Double Longg; 

private List<GeoName> names = new ArrayList<GeoName>(); 

public PostalCodeAdapter(Context ctx, List<GeoName> locations) { 
    this.ctx = ctx; 
    this.names = locations; 
} 

@Override 
public int getCount() {  

    return names.size(); 

    } 

@Override 
public Object getItem(int arg0) { 
    return null; 
} 

@Override 
public long getItemId(int arg0) { 
    return 0; 
} 

@Override 
public View getView(int arg0, View arg1, ViewGroup arg2) { 

    LinearLayout layout = new LinearLayout(ctx); 
    AbsListView.LayoutParams params = new AbsListView.LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.FILL_PARENT); 
    layout.setLayoutParams(params); 

    layout.setOrientation(LinearLayout.HORIZONTAL); 

    GeoName location = this.names.get(arg0); 

    Location l = location.getGeometry().getLocation(); 

    Latt = l.getLat(); 
    Longg = l.getLng(); 

    TextView value = new TextView(this.ctx); 
    value.setText(location.getName()); 
    value.setMaxHeight(100); 
    value.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); 
    value.setGravity(Gravity.CENTER); 
    value.setOnClickListener(new CityClickListener(location)); 

    layout.addView(value); 

    return layout; 
} 

class CityClickListener implements OnClickListener { 

    private GeoName geoName = null; 

    CityClickListener(GeoName name) { 
     this.geoName = name; 
    } 

    @Override 
    public void onClick(View v) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
     builder.setView(createView()); 
     builder.setTitle("Details of " + geoName.getName()); 
     builder.setCancelable(true); 

     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
     }); 

     AlertDialog alert = builder.create(); 
     alert.show(); 

     updateMap();  
    } 

    private void updateMap() { 

     MapActivity mapAct = (MapActivity)ctx; 
     MapView map = (MapView)mapAct.findViewById(R.id.map); 
     map.setScrollBarStyle(MapView.SCROLLBARS_INSIDE_INSET); 
     map.setBuiltInZoomControls(Boolean.TRUE); 
     map.displayZoomControls(Boolean.TRUE); 

********** ISSUE: THE PASSED LAT AND LONG VALUES ARE NOT BEING PASSED TO THE OVERLAY ********** 
     GeoPoint point = new GeoPoint((int)(Latt* 1E6), (int)(Longg * 1E6)); 
     MapController mc = map.getController(); 
     mc.setZoom(17); 
     mc.setCenter(point); 
     mc.animateTo(point); 

      List<Overlay> overlay = map.getOverlays(); 

     overlay.clear(); 

     Drawable marker = ctx.getResources().getDrawable(R.drawable.marker); 
     MyItemizedOverlay overlays = new MyItemizedOverlay(marker, map, ctx); 

     OverlayItem pointerConverted = new OverlayItem(point, geoName.getName(), null); 

     overlay.add(overlays); 
     overlays.addOverlay(pointerConverted); 

    } 

    private View createView() { 

     LinearLayout l = new LinearLayout(ctx); 
     l.setOrientation(LinearLayout.VERTICAL); 
     LinearLayout.LayoutParams params = new LayoutParams(100, 300); 
     l.setLayoutParams(params); 

     TextView city = new TextView(ctx); 
     city.setText("Supermarket: " + geoName.getName() + ""); 
     city.setMaxHeight(100); 
     city.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); 
     city.setGravity(Gravity.CENTER); 
     //city.setTextColor(ctx.getResources().getColor(R.color.white)); 

     TextView orientation = new TextView(ctx); 
     //orientation.setText("Orientation : " + geoName.lat + " || " + geoName.lng); 
     orientation.setMaxHeight(100); 
     orientation.setTypeface(Typeface.DEFAULT, Typeface.NORMAL); 
     orientation.setGravity(Gravity.CENTER); 
     l.addView(city); 
     l.addView(orientation); 

     return l; 
    } 
} 
} 
+0

Qual è la definizione di un GeoName? – Houf

+0

@Houf GeoName è la classe che viene utilizzata per mappare le risposte JSON mediante l'uso di classi 'layer'. Ho aggiunto la classe al codice sopra. Da quello che vedo, non riesco ad accedere all'id dell'oggetto array che è stato cliccato dal mio listview. – user1352057

+0

ti suggerirei di usare almeno google maps api v2 – user2065529

risposta

3

riusciti a risolvere questo.

Per chiunque stia utilizzando una risposta a livelli JSON. Assicurati di accedere ai valori lat e long dalle classi di oggetti GeoPoint corrette.

Problemi correlati