0

Android Maps API v2 に基づいて位置情報アプリを作成しようとしています。私は自分の位置ポイントにマーカーを追加し、位置精度のために GroundOverlay 円を追加します。ただし、GroundOverlay の setPosition 関数の設定は少し異なります。理由がわかりません。

        package com.example.locator;

    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.BitmapDescriptorFactory;
    import com.google.android.gms.maps.model.GroundOverlay;
    import com.google.android.gms.maps.model.GroundOverlayOptions;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.Marker;
    import com.google.android.gms.maps.model.MarkerOptions;

    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.content.Context;
    import android.support.v4.app.FragmentActivity;
    import android.view.Menu;

    public class MainActivity extends FragmentActivity implements LocationListener
     {
        GoogleMap mMap;
        Location                lastLocation = null;
        private LocationManager locationManager;
        private String provider;
        Marker curLoc = null; 
        GroundOverlay curLocCircle = null; 

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);

            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(22.375675950685434, 29.83346939086914), 13));

            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            Criteria criteria = new Criteria();
            provider = locationManager.getBestProvider(criteria, false);
            Location location = locationManager.getLastKnownLocation(provider);

            if (location != null) {
                onLocationChanged(location);
            } else {
                //empty
            }
            locationManager.requestLocationUpdates(provider, 400, 1, this);
        } 

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }


        public void onLocationChanged(Location location) {
            if (location != null) {

                if (null != curLoc) {
                    curLoc.remove();
                }
                if (null != curLocCircle) {
                    curLocCircle.remove();
                }

                LatLng loc = new LatLng(location.getLatitude(),location.getLongitude());
                curLoc = mMap.addMarker(new MarkerOptions()
                .position(loc)
                .title("My location")
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.location32)));

                float accuracy = location.getAccuracy();

                curLocCircle = mMap.addGroundOverlay(new GroundOverlayOptions()
                        .image(BitmapDescriptorFactory
                                .fromResource(R.drawable.location_circle))
                        .position(loc, accuracy)
                        .transparency(0)
                );
                curLocCircle.setPosition(loc);
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, 13));
            }
        }

        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }

    }

オンラインでデバッガーでアプリを一時停止すると

mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(loc, 13));

時計はこのデータを示しています:

curLocCircle.getPosition()  lat/lng: (22.397815012772206,29.954818561673164)
location.getLatitude()      22.397815
location.getLongitude()     29.9548184
loc                         lat/lng: (22.397815,29.9548184)

curLocCircle.getPosition() は、setPosition(loc); の後に間違った場所の書き込みを表示します。それを手伝ってください。

4

1 に答える 1

1

問題はマーカー アンカーにありました。変更:

curLoc = mMap.addMarker(new MarkerOptions()
.position(loc)
.anchor(0.5f, 0.5f)
.title("My location")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.location32)));

そして、すべてが順調です。GroundOverlay の場所が定義された場所と異なる理由はまだわかりませんが、気にしません。よさそうです。

于 2013-01-19T12:47:18.057 に答える