1

我一直在学习一系列教程,使用带有地图 API v2 的 Google 地方为 android 制作一个基本的餐厅定位器应用程序。我遇到的问题是我的 gps 位置是正确的,但是在地图上绘制的用于显示用户位置的标记位于用户实际位置东南约 60-65 英里处。

这是我的 Location 类的代码:

public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location = null; 
double latitude; 
double longitude; 

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

protected LocationManager locationManager;

public GPSTracker(Context context) {
    this.mContext = context;
    getLocation();
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // no network provider is enabled
        } 
        else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network Enabled");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

public void stopUsingGPS() {
    if (locationManager != null) {
        locationManager.removeUpdates(GPSTracker.this);
    }
}

public double getLatitude() {
    if (location != null) {
        latitude = location.getLatitude();
    }

    return latitude;
}

public double getLongitude() {
    if (location != null) {
        longitude = location.getLongitude();
    }

    return longitude;
}

public boolean canGetLocation() {
    return this.canGetLocation;
}

最后是我的地图活动的代码:

public class PlacesMapActivity extends FragmentActivity {
double latitude;
double longitude;
LatLng USER=null;
LatLng LOCATION=null;
PlacesList nearPlaces;
private GoogleMap map;
private int userIcon, locationIcon;
String address;
String name;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map_places);

    userIcon = R.drawable.mark_red;
    locationIcon = R.drawable.mark_blue;

    Intent i = getIntent();

    String user_latitude = i.getStringExtra("user_latitude");
    String user_longitude = i.getStringExtra("user_longitude");
    String user_location = (user_latitude + ", " + user_longitude);

    SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.mapView);
    map = fm.getMap();

    USER = new LatLng((int) (Double.parseDouble(user_latitude)),
            (int) (Double.parseDouble(user_longitude)));

    Marker user = map.addMarker(new MarkerOptions().position(USER)
            .title("This is you.")
            .snippet(user_location)
            .icon(BitmapDescriptorFactory
                    .fromResource(userIcon)));

    nearPlaces = (PlacesList) i.getSerializableExtra("near_places");
    if(nearPlaces != null) {
        for(Place place : nearPlaces.results) {             
            latitude = place.geometry.location.lat;
            longitude = place.geometry.location.lng;
            name = place.name;
            address= place.vicinity;
        }

        final LatLngBounds.Builder builder = new LatLngBounds.Builder();

        for(int c = 0; c < nearPlaces.results.size(); c++){
            final LatLng pos = new LatLng(nearPlaces.results.get(c).geometry.location.lat,
                    nearPlaces.results.get(c).geometry.location.lng);
            builder.include(pos);
            map.addMarker(new MarkerOptions().position(pos)
                        .title(nearPlaces.results.get(c).name)
                        .snippet(nearPlaces.results.get(c).vicinity)
                        .icon(BitmapDescriptorFactory
                                .fromResource(locationIcon)));
        }
    }

    map.moveCamera(CameraUpdateFactory.newLatLngZoom(USER, 14));

    map.animateCamera(CameraUpdateFactory.zoomTo(9), 2000, null);

}

我试图附上截图,显然我还不能。我将标记片段设置为在单击时向用户显示纬度和经度。当我单击用户标记时,它显示正确的经度和纬度(在互联网上检查它们,它在我实际位置的一个街区内),但正如我所说,用户的标记始终显示东南 60-65 英里。此外,Places 结果的位置都是正确的,并且标记在正确的位置。

任何帮助是极大的赞赏。干杯。

4

1 回答 1

2

在下面的代码中

 USER = new LatLng((int) (Double.parseDouble(user_latitude)),
        (int) (Double.parseDouble(user_longitude)));

不要将经纬度转换为int,而是将它们保留为double.

干杯!

于 2013-05-21T17:58:50.953 回答