San*_*til 12 gps android google-maps-android-api-2 google-location-services
我在Google地图上绘制一条折线,取决于半径(1 - 100米).一旦绘制了心脏,用户需要在心脏边界上行走并且需要从头到尾完成(从底部开始然后向左然后向右然后再向下开始).
我能画出心脏,我得到了360分(latlng).这是我的代码,它将绘制心脏和图像.
private void initPath() {
path = new PolylineOptions();
path.color(ContextCompat.getColor(mActivity,R.color.heart_green));
path.width(25);
// offset to bottom
double offsetY = getY(Math.toRadians(180));
for (int angle = 0; angle <= 360; angle++) {
double t = Math.toRadians(angle);
double x = getX(t);
double y = getY(t) - offsetY;
//Log.d(TAG, "angle = " + angle + "(x = " + x + ",y= " + y + ")");
//convert x,y to lat lng
LatLng latLng = getLatLng(x, y, center);
path.add(latLng);
heart360Points.add(latLng);
}
}
private double getX(double t) {
return radius * 16 * Math.sin(t) * Math.sin(t) * Math.sin(t) / HEART_RATIO;
}
private double getY(double t) {
return radius * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t)) / HEART_RATIO;
}
private LatLng getLatLng(double dx, double dy, LatLng centerHeart) {
return new LatLng(centerHeart.latitude + Math.toDegrees(dy / EARTH_RADIUS),
centerHeart.longitude + Math.toDegrees(dx / EARTH_RADIUS) / Math.cos(Math.toRadians(centerHeart.latitude)));
}
Run Code Online (Sandbox Code Playgroud)
但每当我试图在心脏边界上行走时,GPS的位置太多波动,所以我永远无法完成心脏的行走.我目前每秒请求位置.
这是我的位置代码.
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 2000 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.love_lead_perform);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mApiClient = new GoogleApiClient.Builder(this)
.addApi(ActivityRecognition.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mApiClient.connect();
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mSettingsClient = LocationServices.getSettingsClient(this);
createLocationCallback();
createLocationRequest();
createLocationSettingsRequest();
}
private void createLocationSettingsRequest() {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
mLocationSettingsRequest = builder.build();
}
private void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么GPS位置波动太大.即使我站着,我也会得到不同的GPS位置.
如何获得准确的GPS定位?
位置波动是正常行为。问题是,你应该何时/如何接受或放弃意外的位置。正如用户(Patrick Artner)评论的那样,您应该放弃突然的侧向移动。
您可以通过两种方式放弃这些动作,
让我们决定最低标准(1 米)。
假设最小距离为 1 米,因为如果人类“行走(而不是站立)”,这是可能的,人类可以在“X”秒内移动至少 1 米的距离。因此,如果返回的覆盖距离小于 1 米,您可以简单地丢弃。
让我们决定最大标准(5 米)。
假设最大距离为 5 米,因为如果人类“行走(而不是跑步)”,这是不可能的,人类可以在“X”秒内移动超过 5 米的距离。因此,如果返回的距离超过 5 米,您可以简单地丢弃。
在哪里,
距离 = NEW_LOCATION - OLD_LOCATION (如何获取距离?)
X = 一定的时间(以秒为单位)
只接受小于5m和大于1m的位置(距离范围您可以根据自己的理解选择)。
例如,此处介绍了 GPS 系统误差的基础知识。使用扩展卡尔曼滤波器融合来自 GPS 的数据(恕我直言,原始的、未过滤的、从GpsStatus.NmeaListener / OnNmeaMessageListener接收的 GPS 数据)和其他传感器(加速度计、陀螺仪、磁力计等)可以提高准确性,但目前不可能创建具有所描述功能的良好应用程序(轨道路径大约 100m“复杂”图)。如果你简化路径(如图所示)
并跟踪交叉检查点“地理围栏”及其顺序 - 也许您可以实现功能,但在许多情况下准确性将是不可接受的。
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |