2013-03-07 19 views
15

Mam aplikację Google Maps, która pobiera wartości długie i długie, a dzięki użyciu odpowiedzi JSON Google przechowuje wiele obiektów supermarketów z ich względnymi wartościami długości i długości. Używam klasy nakładki do umieszczenia znacznika na mapie w zależności od wybranego supermarketu z listy, która pokazuje dostępne supermarkety.Problem z dokładnością map Google

Wszystko działa dobrze, gdy wydaje mi się, że mam niewielki problem z dokładnością mojej klasy nakładki. Znacznik mapy nie wydaje się być bardzo dokładny, ponieważ znacznik wskazuje w niewłaściwym miejscu określone długie i długie punkty przekazane do niego z mojego obiektu geopoint. (czasami nawet do 11 mil od miejsca, w którym powinno być).

Próbowałem zadeklarować LOCATION_FINE w moim manifeście na pozwolenie na zastosowania, ale to nie wydaje się robić żadnej różnicy. Czy potrzebuję tego, ponieważ korzystam z odpowiedzi JSON, a nie z GPS?

Jak dokładna jest mapa na emulatorze? Być może trzymam się tu słomek, ale słyszałem, jak wiele osób mówi, że podczas korzystania z Google API na emulatorze nie jest to takie dokładne.

Nie jest używany GPS.

EDYTOWANIE

Aby dodać do tego pytania. Mam inne pytanie, które idzie głębiej. Wydaje mi się, że problem leży w mojej metodzie update(), ponieważ problem polega na tym, że nieprawidłowy obiekt lat i długie wartości są wysyłane do znacznika.

Opublikuję mój kod, aby sprawdzić, czy ktoś może znaleźć jakiekolwiek problemy.

klasa GeoName: Klasa

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

Jaka jest definicja GeoName? – Houf

+0

@Houf GeoName to klasa używana do mapowania odpowiedzi JSON poprzez użycie "warstw" klas. Dodałem klasę do powyższego kodu. Z tego, co widzę, nie mogę uzyskać dostępu do identyfikatora obiektu tablicy, który został kliknięty z mojego widoku listy. – user1352057

+0

Proponuję użyć co najmniej mapy google api v2 – user2065529

Odpowiedz

3

Udało się to rozwiązać.

Dla każdego, kto używa odpowiedzi warstwowej JSON. Upewnij się, że uzyskujesz dostęp do wartości krótkich i długich z prawidłowych klas obiektów GeoPoint.