2013-03-07 71 views
15

我有一個谷歌地圖應用程序,抓取用戶經度和長期價值,並通過使用谷歌JSON響應存儲一系列的超市對象與他們的相對拉特和長期值。我使用疊加類將標記放置到地圖上,依賴於列表視圖中顯示可用超市的所選超市。谷歌地圖精度問題

這一切都很好,我似乎有一個小問題是我的覆蓋類的準確性。地圖標記看起來似乎不太準確,因爲標記指向指定經緯度的錯誤位置,並且從我的地點對象傳遞給它的長點。 (有時距離應該達到11英里)。

我試過在使用權限的清單中聲明LOCATION_FINE,但這似乎沒有任何區別。我是否需要這個,因爲我使用的是JSON響應而不是GPS?

模擬器上的地圖有多準確?我可能會在這裏抓着稻草,但我聽到有多人說,在模擬器上使用Google API時,它並不是那麼準確。

沒有使用GPS。

編輯

添加到此問題。我還有一個更深入的問題。我相信這個問題在我的update()方法中,因爲問題是不正確的對象lat和long值被髮送到標記。

我會發布我的代碼,看看是否有人可以找到任何問題。

GeoName類:

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

什麼是GeoName的定義? – Houf 2013-03-10 15:27:25

+0

@Houf GeoName是用於通過使用類'圖層'映射JSON響應的類。我已將該類添加到上面的代碼中。從我可以看到我似乎無法訪問已從我的列表視圖中單擊的數組對象的ID。 – user1352057 2013-03-10 15:41:13

+0

我建議你至少使用谷歌地圖api v2 – user2065529 2013-03-12 12:35:18

回答

3

管理排序此。

對於使用JSON分層響應的其他人。確保從正確的GeoPoint對象類訪問經緯度值。