2013-03-07 8 views
15

Ich habe eine Google Maps App, die die Benutzer Lat und Long-Werte ergreift, und durch die Verwendung einer Google JSON Antwort speichert eine Reihe von Supermarkt-Objekte mit ihren relativen Lat und Long-Werte. Ich verwende eine Overlay-Klasse, um eine Markierung auf der Karte abhängig vom ausgewählten Supermarkt aus der Listenansicht zu platzieren, die die verfügbaren Supermärkte anzeigt.Google Maps Genauigkeit Problem

Das alles funktioniert gut, wo ich ein kleines Problem mit der Genauigkeit meiner Overlay-Klasse zu haben scheint. Die Kartenmarkierung scheint nicht sehr genau zu sein, da die Markierung auf die falsche Stelle des angegebenen Breitengrads und die langen Punkte zeigt, die von meinem Geopunktobjekt an sie übergeben werden. (manchmal bis zu 11 Meilen entfernt von wo es sein sollte).

Ich habe versucht, die LOCATION_FINE in meinem Manifest auf die Verwendungen Berechtigungen zu deklarieren, aber dies scheint keinen Unterschied zu machen. Brauche ich das, da ich eine JSON-Antwort anstelle von GPS verwende?

Wie genau ist die Karte auf dem Emulator? Ich halte mich hier zwar an Strohhalmen fest, aber ich habe mehrere Leute gehört, die sagen, dass wenn sie die Google-APIs auf dem Emulator verwenden, es nicht so genau ist.

Kein GPS wird verwendet.

BEARBEITEN

Um diese Frage hinzuzufügen. Ich habe eine andere Frage, die tiefer geht. Ich glaube, das Problem liegt innerhalb meiner update() -Methode, da das Problem das falsche Objekt ist und lange Werte an den Marker gesendet werden.

Ich poste meinen Code, nur um zu sehen, ob irgendjemand irgendwelche Probleme finden kann.

GeoName Klasse:

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 Klasse:

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

Was ist die Definition eines GeoName? – Houf

+0

@Houf GeoName ist die Klasse, die verwendet wird, um die JSON-Antworten mithilfe von Klassenlayern zuzuordnen. Ich habe die Klasse zum obigen Code hinzugefügt. Von dem, was ich sehen kann, scheint ich nicht auf die ID des Array-Objekts zuzugreifen, das aus meiner Listenansicht geklickt wurde. – user1352057

+0

Ich würde vorschlagen, dass Sie mindestens Google Maps API v2 verwenden – user2065529

Antwort

3

Managed diese zu sortieren.

Für alle anderen, die eine JSON-Schichtantwort verwenden. Stellen Sie sicher, dass Sie auf Ihre Breiten- und Längenwerte aus den richtigen GeoPoint-Objektklassen zugreifen.