Rah*_*wat 1 gps android latitude-longitude
我的挑战任务是获得非常高的准确性.所以我使用的是GPS_PROVIDER.但我的代码准确性不正确.有一段时间它显示我离我当前位置10到50米.有一段时间它显示我离我当前位置5到15米的距离.我已经测试了两个设备,如XOLO和索尼.我已经完成了这些问题并且无法修复它.这是我的代码: -
@Override
protected void onResume() {
super.onResume();
if(mMap!= null)
mMaprivate LatLng geo;
map.clear();
locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
mFragment = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.map);
mMap = mFragment.getMap();
}
setListener();
}
private void setListener() {
System.out.println("setListener() locationListener = "+locationListener);
if(locationListener != null){
clearListener();
}
Toast toast = Toast.makeText(this, this.getResources().getString(R.string.maps_loading), Toast.LENGTH_LONG);
toast.show();
private LatLng geo;
locationListener = new CustomLocationListener();
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//criteria.setAccuracy(Criteria.ACCURACY_HIGH);
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
String bestProvider = locationManager.getBestProvider(criteria, true);
Toast.makeText(this, "bestProvider= "+bestProvider, Toast.LENGTH_SHORT).show();
// locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(bestProvider, 0, 0, locationListener);
handler=new Handler();
timeoutTask = new TimeoutTask(locationListener);
handler.postDelayed(timeoutTask, 50*1000);
}
private void clearListener(){
if(locationListener != null){
locationManager.removeUpdates(locationListener);
locationListener = null;
}
}
private void gotLocation(Location location){
loc = location;
System.out.println("getLocation = "+location.getLatitude());
// Toast.makeText(getBaseContext(), "new Lat = "+location.getLatitude(), Toast.LENGTH_LONG).show();
}
public class CustomLocationListener implements LocationListener {
private boolean isCompleted = false;
public CustomLocationListener() {}
@Override
public void onLocationChanged(Location location) {
isCompleted=true;
System.out.println("onLocationChanged 1");
// Called when a new location is found by the GPS location provider.
if(isBetterLocation(location, loc)){
// Toast.makeText(getBaseContext(), "yes", Toast.LENGTH_LONG).show();
System.out.println("onLocationChanged 2");
gotLocation(location);
}
System.out.println("onLocationChanged 3");
clearListener();
setUserPoint();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) { }
@Override
public void onProviderEnabled(String provider) { }
@Override
public void onProviderDisabled(String provider) { }
public boolean isCompleted() {
return isCompleted;
}private LatLng geo;
}
private LatLng geo;
public class TimeoutTask implements Runnable {
private CustomLocationListener listener;
public TimeoutTask(CustomLocationListener listener) {
this.listener=listener;
}
@Override
public void run() {
// TODO Auto-generated method stub
if (listener == null || listener.isCompleted()) {
Log.e("provider", "completed");
}
else {
Toast.makeText(ScorecardMapViewActivity.this, "We were unable to find your position, please try again", Toast.LENGTH_LONG).show();
Log.e("provider", "timeout");
clearListener();
setUserPoint();
if(goToScorecardStep3WithLocation) finish();
}
}
}
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
if (currentBestLocation == null) {
// A new location is always better than no location
return true;
}
// Check whether the new location fix is newer or older
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
// If it's been more than two minutes since the current location, use the new location
// because the user has likely moved
if (isSignificantlyNewer) {
return true;
// If the new location is more than two minutes older, it must be worse
} else if (isSignificantlyOlder) {
return false;
}
// Check whether the new location fix is more or less accurate
int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
// Check if the old and new location are from the same provider
boolean isFromSameProvider = isSameProvider(location.getProvider(),
currentBestLocation.getProvider());
// Determine location quality using a combination of timeliness and accuracy
if (isMoreAccurate) {
return true;
} else if (isNewer && !isLessAccurate) {
return true;
} else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
return true;
}
return false;
}
private LatLng geo;
private void setUserPoint() {
if(!goToScorecardStep3WithLocation) {
if(loc != null) {
if(handler != null) { System.out.println("removed timeout task from handler");
handler.removeCallbacks(timeoutTask); }
geo = HelperUtil.getLatLng(loc);
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(geo, 18));
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
System.out.println("loc.getLatitude() = "+loc.getLatitude());
System.out.println("loc.getLongitude() = "+loc.getLongitude());
// your current position show.
mMap.addMarker(new MarkerOptions().title("Player").position(geo)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_point)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
请任何一位专家帮助我.你的帮助将非常有帮助.谢谢!
更新:-
我注意到我在同一个地方.有时我得到长小数点和有时小小数点.是否也会因小数点计算距离而产生任何影响?我在Yard计算距离.
当前位置= 纬度28.65361000000004长= 77.4122733333333
之前的当前位置点(这是相同的地方,但是纬度/长度不同)
Lat = 28.653685000000003 Long = 77.4123083333334
我有8码的距离.我认为一些问题可能是由于长或小的数字点.是否有办法让我们只获得长小数?
消费者GPS接收器在95%的情况下具有2.5-6m的精确度,你无法改善移动设备.
如果您静止不动(通过用户交互告知静止开始和停止结束),您可以计算平均位置.
特别是当静止不动时,GPS芯片的精确度稍差,因为多普勒频移只能在移动时使用.
为了计算设备的准确性,您应该采取一些措施,计算平均位置,并计算每个测量到该平均位置的距离.然后应该给出3-6米之间的值.
你写道,你站在两个位置之间的距离是0m.
但这不适用于GPS.由于对流层的波动条件,信号延迟略有变化,在静止时造成跳跃位置.
如果您启用了静态过滤器,那么您只能获得0米,iOS默认使用.在Android中还应该有可能启用这样的过滤器(例如,通过将距离阈值设置为高于0的值).
| 归档时间: |
|
| 查看次数: |
2325 次 |
| 最近记录: |