GPS位置波动

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定位?

Dhr*_*ruv 5

位置波动是正常行为。问题是,你应该何时/如何接受或放弃意外的位置。正如用户(Patrick Artner)评论的那样,您应该放弃突然的侧向移动。

您可以通过两种方式放弃这些动作,

  1. 让我们决定最低标准(1 米)。

    假设最小距离为 1 米,因为如果人类“行走(而不是站立)”,这是可能的,人类可以在“X”秒内移动至少 1 米的距离。因此,如果返回的覆盖距离小于 1 米,您可以简单地丢弃。

  2. 让我们决定最大标准(5 米)。

    假设最大距离为 5 米,因为如果人类“行走(而不是跑步)”,这是不可能的,人类可以在“X”秒内移动超过 5 米的距离。因此,如果返回的距离超过 5 米,您可以简单地丢弃。

在哪里,

距离 = NEW_LOCATION - OLD_LOCATION (如何获取距离?

X = 一定的时间(以秒为单位)

只接受小于5m和大于1m的位置(距离范围您可以根据自己的理解选择)。


And*_*nko 3

例如,此处介绍了 GPS 系统误差的基础知识。使用扩展卡尔曼滤波器融合来自 GPS 的数据(恕我直言,原始的、未过滤的、从GpsStatus.NmeaListener / OnNmeaMessageListener接收的 GPS 数据)和其他传感器(加速度计、陀螺仪、磁力计等)可以提高准确性,但目前不可能创建具有所描述功能的良好应用程序(轨道路径大约 100m“复杂”图)。如果你简化路径(如图所示)

“简化”心路

并跟踪交叉检查点“地理围栏”及其顺序 - 也许您可以实现功能,但在许多情况下准确性将是不可接受的。