15

ユーザーの緯度と経度の値を取得する Google マップ アプリがあり、Google JSON 応答を使用して、さまざまなスーパーマーケット オブジェクトを相対的な緯度と経度の値と共に保存します。オーバーレイ クラスを使用して、利用可能なスーパーマーケットを表示するリストビューから選択したスーパーマーケットに応じて、マップ上にマーカーを配置します。

これはすべて正常に機能しますが、オーバーレイ クラスの精度にわずかな問題があるようです。マップ マーカーは、ジオポイント オブジェクトから渡された指定された緯度経度ポイントの間違った場所を指しているため、あまり正確ではないようです。(あるべき場所から最大 11 マイル離れている場合もあります)。

uses パーミッションのマニフェストで LOCATION_FINE を宣言しようとしましたが、違いはないようです。GPS ではなく JSON 応答を使用しているので、これは必要ですか?

エミュレーターの地図はどのくらい正確ですか? 私はここでストローを握りしめているかもしれませんが、エミュレータで Google API を使用する場合、それほど正確ではないと言う人が複数いるのを聞いたことがあります。

GPS は使用されていません。

編集

この質問に追加します。より深く掘り下げた別の質問があります。問題は間違ったオブジェクトの緯度と経度の値がマーカーに送信されているため、問題は update() メソッド内にあると思います。

誰かが問題を見つけることができるかどうかを確認するために、コードを投稿します。

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;
    }   
}
}
4

2 に答える 2

3

これを並べ替えることができました。

JSON 階層化された応答を使用しているその他のユーザー向け。正しい GeoPoint オブジェクト クラスから緯度と経度の値にアクセスしていることを確認してください。

于 2013-03-10T19:36:28.230 に答える
2

簡単にするために、最近の更新で Google Maps Android API v2 を使用すると、タスクが簡単になります。 https://developers.google.com/maps/documentation/android/start

GoogleMap オブジェクトを作成し、適切なリスナーを追加するだけです。

于 2013-03-13T07:28:19.023 に答える