0

非常に奇妙な問題があります。

まず、MapView をズームインおよびズームアウトすると、マーカー (オーバーレイ) が正しくない場所に移動します (スケーリングではうまく機能しません)。

第二に、市場は間違った位置に描かれています!

以下にコードを投稿しますが、最初にこれを聞いてください:

私はイスラマバードにいます。GeoCoder は、私がイスラマバードにいることも教えてくれます。しかし、オーバーレイを使用して現在地の周りに円を描くと、数百キロメートル離れた都市に円が描かれます。

両方の問題で親切に助けてください。

アクティビティは次のとおりです。

public class LocatePickup extends MapActivity implements LocationListener {
    Geocoder gc;

    MapView mapView;
    MapController mc;
    GeoPoint p;

    double lat = 0;
    double lng = 0;

    LocationManager lm;

    WebMethods wm;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.locate_pickup);

        mapView = (MapView) findViewById(R.id.mapView);
        mapView.setBuiltInZoomControls(true);
        mapView.setStreetView(true);

        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 500.0f, this);

        Location l = new Location(LocationManager.NETWORK_PROVIDER);
        l = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        mc = mapView.getController();
        p = new GeoPoint((int) (l.getLatitude()), (int) (l.getLongitude()));
        mc.setCenter(p);
        mc.setZoom(14);

        MapOverlay myLocationOverlay = new MapOverlay();
        List<Overlay> list = mapView.getOverlays();
        list.add(myLocationOverlay);

        gc = new Geocoder(this);
        try {
            List<Address> address = gc.getFromLocation(l.getLatitude(), l.getLongitude(), 1);
            Toast.makeText(this, ""+address.get(0).getAddressLine(1), 1).show();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    class MapOverlay extends com.google.android.maps.Overlay {
        Paint paint = new Paint();
        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
            super.draw(canvas, mapView, shadow);

            Point myScreenCoords = new Point();
            mapView.getProjection().toPixels(p, myScreenCoords);

            paint.setStrokeWidth(1);
            paint.setARGB(255, 218, 28, 28);
            paint.setStyle(Paint.Style.STROKE);

            //Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pin);

            canvas.drawCircle(myScreenCoords.x, myScreenCoords.y, 15, paint);
            //(bmp, myScreenCoords.x, myScreenCoords.y - 256, paint);
            canvas.drawText("Hey!", myScreenCoords.x, myScreenCoords.y, paint);
            return true;
        }
    }

    @Override
    public void onLocationChanged(Location arg0) {
        if(arg0 != null) {
            Log.d("New Location: ", arg0.getLatitude() + " - " + arg0.getLongitude());
            lat = arg0.getLatitude();
            lng = arg0.getLongitude();

            p = new GeoPoint((int) lat * 1000000, (int) lng * 1000000);
            mc.animateTo(p);
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        // empty
    }

    @Override
    public void onProviderEnabled(String provider) {
        // empty
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        //empty
    }
}

コードが完成したら、ユーザーが地図上のスポットをタップしてその住所を取得できるようにしたいと思います (マーカーもそのスポットに移動する必要があります)。しかし、それは正確でなければなりません。

4

2 に答える 2

0

指定されたジオポイントに向かってマップをアニメーション化するには、animateTo() メソッドを使用します。

したがって、メソッドに zoomListener を実装し、次の行を追加します。

mapController.animateTo(geoPoint);

また、試してみてくださいmapview.invalidate()

ところで、ズームリスナーを実装する方法がわからない場合は、 How to implementt OnZoomListener on MapView を参照してください。

2 番目の質問では、NETWORK_PROVIDERGPS を使用して位置の値を取得するよりも精度が低いもののみを使用しました。GPS_PROVIDER効率的で正しい実装により、より正確な値が得られる可能性があります。

そして、地図上で触れた地点の緯度経度を取得するために、mapOverlayクラス内にonTouchEvent

 @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    {   
        //---when user lifts his finger---
        if (event.getAction() == 1) {                
            GeoPoint p = mapView.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());
                Toast.makeText(getBaseContext(), 
                    p.getLatitudeE6() / 1E6 + "," + 
                    p.getLongitudeE6() /1E6 , 
                    Toast.LENGTH_SHORT).show();
        }                            
        return false;
    } 

を使用して緯度と経度から住所を取得できますGeoCoder

Geocoder geoCoder = new Geocoder(
                getBaseContext(), Locale.getDefault());
try {
    List<Address> addresses = geoCoder.getFromLocation(latitude/1E6, 
                    longitude / 1E6, 1);
                String add = "";
                if (addresses.size() > 0) 
                {
                    for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); 
                         i++)
                       add += addresses.get(0).getAddressLine(i) + "\n";
                }

                Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();
  }catch (IOException e) {                
                e.printStackTrace();
   }

そのポイントにマーカーを追加する場合は、overlayItemそのポイントに追加してオーバーレイに追加します。

于 2012-12-24T22:35:59.213 に答える
0

誰もこの質問に正しく答えなかったので..

何らかの理由で、通常の Overlay クラスが正常に機能していませんでした。ItemizedOverlay に切り替えたところ、すべてが完璧になりました。

私は Android の専門家ではないので、経験のある方にコメントしていただきたいのですが、ItemizedOverlay は単純な Overlay よりもはるかに優れていると感じています。itemizedoverlay を使用すると、固定点に描画されたオブジェクトを使用して mapview をズームインおよびズームアウトすると、ピン (オブジェクト) が本来あるべき場所に正確にとどまります (以前はそうではありませんでした)。

探している人のためのコードを次に示します。これはもちろん不完全で、特定の目的のためのものですが、一般的な考え方は理解できます。

`class CustomOverlay extends com.google.android.maps.ItemizedOverlay { private ArrayList mOverlays = new ArrayList(); コンテキスト mContext;

    public CustomOverlay(Drawable defaultMarker)
    {
        super(defaultMarker);

    }

    public void addOverlay(OverlayItem overlay)
    {
        mOverlays.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i)
    {
        return mOverlays.get(i);
    }

    @Override
    public int size()
    {
        return mOverlays.size();
    }

    public CustomOverlay(Drawable defaultMarker, Context context)
    {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView)
    {
        if (event.getAction() == 1)
        {
            p = mapView.getProjection().fromPixels((int) event.getX(),
                    (int) event.getY());

            gc = new Geocoder(getBaseContext(), Locale.getDefault());
            try
            {
                address = gc.getFromLocation(
                        (double) p.getLatitudeE6() / 1E6,
                        (double) p.getLongitudeE6() / 1E6, 1);

                addressfound = true;
            }
            catch (IOException e)
            {
                addressfound = false;
                e.printStackTrace();
            }

            if (address.size() != 0)
            {
                l1 = address.get(0).getAddressLine(0);
                l2 = address.get(0).getAddressLine(1);
                l3 = address.get(0).getAddressLine(2);
            }

            OverlayItem point = new OverlayItem(p, "Location", l1 + ", "
                    + l2 + ", " + l3);
            List<Overlay> mapOverlays = mapView.getOverlays();
            Drawable drawable = getBaseContext().getResources()
                    .getDrawable(R.drawable.androidmarker);
            CustomOverlay itemizedoverlay = new CustomOverlay(drawable,
                    getBaseContext());

            itemizedoverlay.addOverlay(point);
            mapOverlays.clear();
            mapOverlays.add(itemizedoverlay);

            mapView.invalidate();
        }`
于 2013-01-07T05:54:41.257 に答える