我一直在关注一系列教程,使用Google地图API v2制作一个基本的餐厅定位器应用程序。我遇到的问题是我的GPS位置是正确的,但是在地图上绘制的用于显示用户位置的标记位于用户实际位置东南约60-65英里处。
以下是我的位置类的代码:
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英里。此外,位置结果的位置都是正确的,标记位于正确的位置。
非常感谢任何帮助。欢呼声。
答案 0 :(得分:2)
在下面的代码中
USER = new LatLng((int) (Double.parseDouble(user_latitude)),
(int) (Double.parseDouble(user_longitude)));
请勿将纬度 - 经度转换为int
,而应将其保持为double
。
干杯!